Могут ли пользователи изменить хешированный пароль с помощью md5 после входа в систему с логином - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть очень любопытный вопрос, когда дело доходит до хеширования 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 );
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...