java - 用户可以在登录系统后使用 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 );
}
}
解决方案
推荐阅读
- amazon-ec2 - React-Native + Detox + Gitlab-ci + AWS EC2 / 无法使用名称启动 Android 模拟器
- java -
调用 JpaRepository.findAll 时出现 InvocationException(示例) - java - 如何在junit中为Jooq Select Query编写单元测试
- reactjs - Heroku:Django 后端不工作,出现错误 GET http://localhost:8000/api/todos/ net::ERR_CONNECTION_REFUSED
- swift - 如何重写代码以检测 AVPlayer 在 WKWebKit 内何时关闭
- node.js - 尽管 URL 不同,但在多个 Chrome 选项卡中为 cookie 设置了相同的值
- powershell - 使用 VISA 通过 Powershell 发送 SCPI 命令
- php - 如何使用 php 搜索特定行的 txt 文件
- javascript - 如何通过主键对数组的所有数据项进行分组并将组的所有剩余条目收集为分组值列表来重构数组的所有数据项?
- python - 如何在 wagtail 中显式设置默认语言?