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