我在这里:
String password = "123";
byte passwordByte[] = password.getBytes();
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte passwortHashByte[] = md.digest(passwordByte);
passwortHashByte-Array只包含很多数字。我想将这个数字转换为一个String,其中包含作为明文的哈希码。 我是怎么做到的?
答案 0 :(得分:3)
我想将这个数字转换为一个String,其中包含作为明文的哈希码。
哈希不是纯文本。它是二进制数据 - 任意字节。这不是明文,而是MP3文件。
您需要确定要用于二进制数据的文本表示形式。这反过来又取决于你想要使用的数据。为了便于诊断,我建议使用纯ASCII表示 - 可能是base64或hex。如果你需要轻松查看单个字节,hex更易于阅读,但base64更紧凑。
同样重要的是要注意MD5并不是一种特别好的哈希密码方式......而且看起来你甚至没有给它们加盐。对于一个永远不会发布到外部世界的演示应用程序来说可能已经足够了,但你应该真正研究更安全的方法。有关简介,请参阅Jeff Atwood's blog post on the topic,理想情况下可以获得有关编写安全代码的书籍。
答案 1 :(得分:2)
以下是我为自己的网站所做的工作。
private static byte[] fromHex(String hex) {
byte[] bytes = new byte[hex.length() / 2];
for (int i = 0; i < hex.length() / 2; i++) {
bytes[i] = (byte)(Character.digit(hex.charAt(i * 2), 16) * 16 + Character.digit(hex.charAt(i * 2 + 1), 16) - 128);
}
return bytes;
}
private static String toHex(byte[] bytes) {
String hex = new String();
for (int i = 0; i < bytes.length; i++) {
String c = Integer.toHexString(bytes[i] + 128);
if (c.length() == 1) c = "0" + c;
hex = hex + c;
}
return hex;
}
这将允许您将字节数组转换为十六进制字符串和从十六进制字符串转换。
答案 2 :(得分:0)
好吧,byte passwortHashByte[] = md.digest(passwordByte);
可以包含一些控制字符,这会破坏你的字符串。考虑将passwortHashByte []编码为Base64格式,如果你真的需要它的String。您可以使用Apache Commons Codecs来制作base64表单。