使用char 生成MD5哈希

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

快速/简单/ 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 []方法归功于andreyne