3 回答
TA贡献1864条经验 获得超6个赞
更新
您可以使用Apache Commons Codec(1.7+版)为您完成此工作。
DigestUtils.sha1Hex(stringToConvertToSHexRepresentation)
感谢@ Jon Onstott的建议。
旧答案
将您的字节数组转换为十六进制字符串。Real的方法告诉您如何。
return byteArrayToHexString(md.digest(convertme))
和(从Real的操作方法中复制)
public static String byteArrayToHexString(byte[] b) {
String result = "";
for (int i=0; i < b.length; i++) {
result +=
Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
}
return result;
}
顺便说一句,您可以使用Base64获得更紧凑的表示形式。Apache Commons Codec API 1.4拥有这个不错的实用程序,可以消除所有麻烦。请参考这里
TA贡献1806条经验 获得超8个赞
这是我将字符串转换为sha1的解决方案。它在我的Android应用程序中运行良好:
private static String encryptPassword(String password)
{
String sha1 = "";
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(password.getBytes("UTF-8"));
sha1 = byteToHex(crypt.digest());
}
catch(NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch(UnsupportedEncodingException e)
{
e.printStackTrace();
}
return sha1;
}
private static String byteToHex(final byte[] hash)
{
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
TA贡献1876条经验 获得超5个赞
SHA-1(和所有其他哈希算法)返回二进制数据。这意味着(在Java中)它们产生一个byte[]
。这byte
阵并没有表示任何特定的字符,这意味着你不能简单地把它变成一个String
像你这样。
如果您需要一个String
,则必须以byte[]
一种可以表示为的方式对其进行格式化String
(否则,请保留该位置byte[]
)。
代表任意byte[]
可打印字符的两种常见方式是BASE64或简单的十六进制字符串(即,每个字符串byte
由两个十六进制数字表示)。似乎您正在尝试生成十六进制字符串。
还有另一个陷阱:如果要获取Java的SHA-1 String
,则需要将其转换String
为byte[]
第一个(因为SHA-1的输入byte[]
也是)。如果仅myString.getBytes()
按显示方式使用,那么它将使用平台默认编码,因此将取决于您在其中运行的环境(例如,它可能会根据操作系统的语言/区域设置返回不同的数据)。
更好的解决方案是指定要用于编码String
-到- byte[]
这样的转换:myString.getBytes("UTF-8")
。在这里,选择UTF-8(或可以代表每个Unicode字符的另一种编码)是最安全的选择。
添加回答
举报