Java String to SHA1

2022-08-31 06:54:33

我正在尝试在Java中制作一个简单的String到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));
}

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


答案 1

更新
您可以使用Apache Commons编解码器(版本1.7 +)为您完成这项工作。

DigestUtils.sha1Hex(stringToConvertToSHexRepresentation)

感谢@Jon Onstott的这个建议。


旧答案
将字节数组转换为十六进制字符串。Real's How To 告诉你如何去做。

return byteArrayToHexString(md.digest(convertme))

和(抄自Real的How To)

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,有这个很好的实用程序来消除所有的痛苦。参考这里


答案 2

这是我将字符串转换为sha1的解决方案。它在我的安卓应用程序中运行良好:

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;
}