java - 使用 char[] 生成 MD5 哈希

标签 java security hash md5 message-digest

如何转换使用此方法获得的 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 散列算法绝不能用于密码存储,因为它的散列很容易被破解。但是,为了简单起见,我将使用它。

快速/简单/不安全的修复方法是将 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

关于java - 使用 char[] 生成 MD5 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30560830/

相关文章:

php - 需要帮助用盐制作登录页面

arrays - 如何找到其值具有最多元素的散列的键

java - 如何从 String.hashCode() 值获取字符串?

wcf - SOAP 1.2 和 SAML 2.0 兼容性

php - strip_tags() 和 mysqli_real_escape_string() 的安全性

javascript - 如何从 SVG 文档 JavaScript 获取父文档对象?

java - 在使用 Logback 记录计算数据时,我们应该使用 isDebugEnabled() 吗?

java - iReport 中的错误日期破坏了 jasper 服务器报告

java - 在 Spring 验证注释中使用消息参数

java - 运行 JVM 的最低配置是什么?