MessageDigest.digest() 为具有挪威字符的不同字符串返回相同的散列
MessageDigest.digest() returning same hash for different strings having Norwegian character
我正在调用 MessageDigest.digest()
方法来获取密码的哈希值。
如果密码包含挪威字符,例如'ø'
,此方法 returns 具有不同最后字符的不同字符串的相同散列。
"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
相同。
因此您的代码只是对密码的开头进行哈希处理。
我正在调用 MessageDigest.digest()
方法来获取密码的哈希值。
如果密码包含挪威字符,例如'ø'
,此方法 returns 具有不同最后字符的不同字符串的相同散列。
"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
相同。
因此您的代码只是对密码的开头进行哈希处理。