使用 char[] 生成 MD5 哈希
Generating an MD5 Hash with a char[]
如何转换使用此方法获得的 char[] 密码:
char[] password = passwordInputField.getPassword();
到 MD5 哈希?通常我会使用下面的方法,但 getBytes 只与字符串兼容:
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
String hashedPass = new BigInteger(1, md.digest()).toString(16);
注意: 永远不要将 MD5 散列算法用于密码存储,因为它的散列很容易被破解。但是,为了简单起见,我将使用它。
quick/easy/UNSECURE 修复方法是将 char 数组转换为字符串。但是,这是不安全的,因为字符串是不可变的,无法从内存中清除。
String password = new String(passwordInputField.getPassword());
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
String hashedPass = new BigInteger(1, md.digest()).toString(16);
更安全的解决方案:将 char[] 转换为 byte[],然后从内存中清除数组。
private byte[] toBytes(char[] chars) {
CharBuffer charBuffer = CharBuffer.wrap(chars);
ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer);
byte[] bytes = Arrays.copyOfRange(byteBuffer.array(),
byteBuffer.position(), byteBuffer.limit());
Arrays.fill(charBuffer.array(), '\u0000'); // clear sensitive data
Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data
return bytes;
}
char[] passChars = passwordInputField.getPassword();
byte[] passBytes = toBytes(passChars);
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(passBytes);
String hashedPass = new BigInteger(1, md.digest()).toString(16);
Arrays.fill(passChars, '\u0000'); // clear sensitive data
Arrays.fill(passBytes, (byte) 0); // clear sensitive data
编辑:
使用更安全的解决方案更新了答案(创意归功于 user2656928)。
char[] to byte[] method 感谢 andreyne
如何转换使用此方法获得的 char[] 密码:
char[] password = passwordInputField.getPassword();
到 MD5 哈希?通常我会使用下面的方法,但 getBytes 只与字符串兼容:
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
String hashedPass = new BigInteger(1, md.digest()).toString(16);
注意: 永远不要将 MD5 散列算法用于密码存储,因为它的散列很容易被破解。但是,为了简单起见,我将使用它。
quick/easy/UNSECURE 修复方法是将 char 数组转换为字符串。但是,这是不安全的,因为字符串是不可变的,无法从内存中清除。
String password = new String(passwordInputField.getPassword());
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
String hashedPass = new BigInteger(1, md.digest()).toString(16);
更安全的解决方案:将 char[] 转换为 byte[],然后从内存中清除数组。
private byte[] toBytes(char[] chars) {
CharBuffer charBuffer = CharBuffer.wrap(chars);
ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer);
byte[] bytes = Arrays.copyOfRange(byteBuffer.array(),
byteBuffer.position(), byteBuffer.limit());
Arrays.fill(charBuffer.array(), '\u0000'); // clear sensitive data
Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data
return bytes;
}
char[] passChars = passwordInputField.getPassword();
byte[] passBytes = toBytes(passChars);
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(passBytes);
String hashedPass = new BigInteger(1, md.digest()).toString(16);
Arrays.fill(passChars, '\u0000'); // clear sensitive data
Arrays.fill(passBytes, (byte) 0); // clear sensitive data
编辑:
使用更安全的解决方案更新了答案(创意归功于 user2656928)。
char[] to byte[] method 感谢 andreyne