首页 > 解决方案 > 用户可以在登录系统后使用 md5 更改散列密码吗

问题描述

关于 md5 散列,我有一个非常好奇的问题,请参阅我有这个模拟安全系统(是的 md5 并不完全安全),当用户使用正确的密码登录时,我希望用户可以选择更改引脚时,除非这样做似乎有并发症。第一个是你通过这样做得到 md5 哈希:

echo -n 6357 | md5sum

一旦使用它,您将获取该哈希并在此行中替换它:

private static final String VALID_MD5 = "DF3AEBC649F9E3B674EEB790A4DA224E";

这就是事情变得复杂的地方,因为我需要在多个位置使用一个变量来替换散列和实际数字 6357。我需要在本节中有代码:

public static void main( String[] args )
{
    if( Login.login() )
    {

    }
}

当用户登录时,它允许为 6357 输入一个变量,这样他们就可以输入他们想要的任何引脚,然后一旦输入就会返回结果。但是,一旦返回,它将是一个不同的散列,所以我不能将该散列保留在字符串中,它也必须是一个等于新散列的变量。现在的问题是,如果我这样做,则没有初始哈希,并且第一次没有密码,并且您首先输入的任何内容都会成为密码,一旦程序关闭,它就不会记住它。所以我基本上不能在不完全删除任何初始密码的情况下将哈希删除到这样的变量中吗?甚至可以允许用户在这样的设置中更改引脚吗?

完整代码供参考:

import java.security.MessageDigest;
import java.util.Scanner;
public class pin
{
public static void main( String[] args )
{
    if( Login.login() )
    {

    }
}
}

class Login
{

private static final Scanner ONE = new Scanner( System.in );
private static final String VALID_MD5 = "DF3AEBC649F9E3B674EEB790A4DA224E"; 
public static boolean login()
{
    System.out.print( "Enter pin: " );
    String pin = ONE.nextLine();
    if( isValid( pin ) && VALID_MD5.equals( md5HexString( pin ) ) )
    {
        System.out.println( "Login successful." );
        return true;
    }
    System.out.println( "Login failed, invalid pin." );
    return false;
}
private static boolean isValid( String s )
{
    return s.matches( "\\d{4}" );  
}
private static String md5HexString( String s )
{
    return toHexString( md5( s ) );
}
private static byte[] md5( String s )
{
    try
    {
        MessageDigest md = MessageDigest.getInstance( "MD5" );
        byte[] buf = s.getBytes();
        md.update( buf, 0, buf.length );
        return md.digest();
    }
    catch( Exception ex )
    {
        return new byte[16];
    }
}

private static String toHexString( byte[] byteArray )
{
    final String HEX_CHARS = "0123456789ABCDEF"; 

    byte[] result = new byte[byteArray.length << 1];
    int len = byteArray.length;
    for( int i = 0 ; i < len ; i++ )
    {
        byte b = byteArray[i];
        int lo4 = b & 0x0F;
        int hi4 = ( b & 0xF0 ) >> 4;


        result[i * 2] = (byte)HEX_CHARS.charAt( hi4 );
        result[i * 2 + 1] = (byte)HEX_CHARS.charAt( lo4 );
    }
    return new String( result );
}
}

标签: javamd5

解决方案


推荐阅读