Java String到SHA1

我正在尝试用Java创建一个简单的String to SHA1转换器,这就是我所拥有的...


public static String toSHA1(byte[] convertme) {

    MessageDigest md = null;

    try {

        md = MessageDigest.getInstance("SHA-1");

    }

    catch(NoSuchAlgorithmException e) {

        e.printStackTrace();

    } 

    return new String(md.digest(convertme));

}

当我通过它时toSHA1("password".getBytes()),我[�a�ɹ??�%l�3~��.知道它可能是像UTF-8这样的简单编码修复程序,但是有人可以告诉我我应该怎么做才能得到我想要的东西5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8吗?还是我这样做完全错误?


噜噜哒
浏览 649回答 3
3回答

慕尼黑的夜晚无繁华

更新您可以使用Apache Commons Codec(1.7+版)为您完成此工作。DigestUtils.sha1Hex(stringToConvertToSHexRepresentation)感谢@ Jon Onstott的建议。旧答案将您的字节数组转换为十六进制字符串。Real的方法告诉您如何。return byteArrayToHexString(md.digest(convertme))和(从Real的操作方法中复制)public static String byteArrayToHexString(byte[] b) {&nbsp; String result = "";&nbsp; for (int i=0; i < b.length; i++) {&nbsp; &nbsp; result +=&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );&nbsp; }&nbsp; return result;}顺便说一句,您可以使用Base64获得更紧凑的表示形式。Apache Commons Codec API 1.4拥有这个不错的实用程序,可以消除所有麻烦。请参考这里

慕森卡

这是我将字符串转换为sha1的解决方案。它在我的Android应用程序中运行良好:private static String encryptPassword(String password){&nbsp; &nbsp; String sha1 = "";&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; MessageDigest crypt = MessageDigest.getInstance("SHA-1");&nbsp; &nbsp; &nbsp; &nbsp; crypt.reset();&nbsp; &nbsp; &nbsp; &nbsp; crypt.update(password.getBytes("UTF-8"));&nbsp; &nbsp; &nbsp; &nbsp; sha1 = byteToHex(crypt.digest());&nbsp; &nbsp; }&nbsp; &nbsp; catch(NoSuchAlgorithmException e)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }&nbsp; &nbsp; catch(UnsupportedEncodingException e)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }&nbsp; &nbsp; return sha1;}private static String byteToHex(final byte[] hash){&nbsp; &nbsp; Formatter formatter = new Formatter();&nbsp; &nbsp; for (byte b : hash)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; formatter.format("%02x", b);&nbsp; &nbsp; }&nbsp; &nbsp; String result = formatter.toString();&nbsp; &nbsp; formatter.close();&nbsp; &nbsp; return result;}

慕运维8079593

SHA-1(和所有其他哈希算法)返回二进制数据。这意味着(在Java中)它们产生一个byte[]。这byte阵并没有表示任何特定的字符,这意味着你不能简单地把它变成一个String像你这样。如果您需要一个String,则必须以byte[]一种可以表示为的方式对其进行格式化String(否则,请保留该位置byte[])。代表任意byte[]可打印字符的两种常见方式是BASE64或简单的十六进制字符串(即,每个字符串byte由两个十六进制数字表示)。似乎您正在尝试生成十六进制字符串。还有另一个陷阱:如果要获取Java的SHA-1&nbsp;String,则需要将其转换String为byte[]第一个(因为SHA-1的输入byte[]也是)。如果仅myString.getBytes()按显示方式使用,那么它将使用平台默认编码,因此将取决于您在其中运行的环境(例如,它可能会根据操作系统的语言/区域设置返回不同的数据)。更好的解决方案是指定要用于编码String-到-&nbsp;byte[]这样的转换:myString.getBytes("UTF-8")。在这里,选择UTF-8(或可以代表每个Unicode字符的另一种编码)是最安全的选择。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java