MessageDigest.digest() 为具有挪威字符的不同字符串返回相同的哈希



我正在调用MessageDigest.digest()方法来获取密码的哈希。如果密码包含挪威语字符,例如 'ø',此方法为具有不同最后一个字符的不同字符串返回相同的哈希。 "Høstname1""Høstname2"具有相同的哈希值,但由于位置不同"Hostnøme1" 'ø'哈希值会有所不同。这是使用"utf-8"编码。对于"iso-8859-1"编码,我没有看到此问题。这是一个已知问题还是我在这里遗漏了什么?

这是我的代码:

    import java.security.MessageDigest;
    String password = "Høstname1";
    String salt = "6";
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
    byte[] hash = new byte[40];
    messageDigest.update(salt.getBytes("utf-8"), 0, salt.length());
    messageDigest.update(password.getBytes("utf-8"), 0, password.length());
    hash = messageDigest.digest();

不应将字符串的长度传递给messageDigest.update

messageDigest.update(password.getBytes("utf-8"), 0, password.length());

但是字节数组的长度,因为 UTF-8 编码字符串的字节数通常比字符串中的字符数多:

byte[] pwd = password.getBytes("utf-8");
messageDigest.update(pwd, 0, pwd.length);

甚至更短(谢谢@Matt(

messageDigest.update(password.getBytes("utf-8"));

salt也一样。

因此,您的代码只是对密码的开头进行哈希处理。

相关内容

  • 没有找到相关文章

最新更新