计算字节数组的SHA-1

Mik*_*ike 46 java sha1

我正在寻找一种方法来获取带有Java字节数组的SHA-1校验和作为消息.

我应该使用第三方工具还是JVM中内置的东西可以提供帮助?

Pas*_*ent 50

关于什么:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;

public static String SHAsum(byte[] convertme) throws NoSuchAlgorithmException{
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    return byteArray2Hex(md.digest(convertme));
}

private static String byteArray2Hex(final byte[] hash) {
    Formatter formatter = new Formatter();
    for (byte b : hash) {
        formatter.format("%02x", b);
    }
    return formatter.toString();
}
Run Code Online (Sandbox Code Playgroud)

  • @PascalThivent但是另一个程序员可能会停下来并使用这个答案,包括错误(这毕竟是SO的部分内容).哈希就像它一样模糊不清(文档如"通过sha-1哈希这些字符串连接来计算这个签名",没有提到如何编码输入字符和字符串化哈希输出,这是很常见的). (7认同)
  • @jarnbjo感谢您指出潜在的问题.但是,为什么我看不到你的帖子'正确答案呢?它可能不会被接受为正确的答案,但它可能会比现在的9票大得多. (7认同)
  • 我相信提到答案错误的评论不再适用.答案已编辑,转换为Hex String看起来很好. (3认同)
  • 这甚至没有正确编译.我不知道两年前有152k代表的用户如何写这样的答案,直到现在还没人编辑. (2认同)

non*_*tor 9

这是我们用来转换为SHA-1的代码片段,但需要一个代码String而不是Byte[]看到这个javadoc以获取更多信息

        import java.io.UnsupportedEncodingException;
        import java.security.MessageDigest;
        import java.security.NoSuchAlgorithmException;

        public class DoSHA1 {

            private static String convToHex(byte[] data) {
                StringBuilder buf = new StringBuilder();
                for (int i = 0; i < data.length; i++) {
                    int halfbyte = (data[i] >>> 4) & 0x0F;
                    int two_halfs = 0;
                    do {
                        if ((0 <= halfbyte) && (halfbyte <= 9))
                            buf.append((char) ('0' + halfbyte));
                        else
                            buf.append((char) ('a' + (halfbyte - 10)));
                        halfbyte = data[i] & 0x0F;
                    } while(two_halfs++ < 1);
                }
                return buf.toString();
            }

            public static String SHA1(String text) throws NoSuchAlgorithmException,
UnsupportedEncodingException  {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] sha1hash = new byte[40];
            md.update(text.getBytes("iso-8859-1"), 0, text.length());
            sha1hash = md.digest();
            return convToHex(sha1hash);
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 如果它对你来说足够快,你也可以使用String.format("%02x",b)将字节转换为十六进制字符串. (2认同)

Jas*_*sha 8

您可以自己完成,也可以依赖已经证明像Commons Codec一样工作的库.本DigestUtils类有几个方法来计算哈希值..