为了账号安全,请及时绑定邮箱和手机立即绑定

Java String到SHA1

Java String到SHA1

噜噜哒 2019-10-06 14:43:49
我正在尝试用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吗?还是我这样做完全错误?
查看完整描述

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拥有这个不错的实用程序,可以消除所有麻烦。请参考这里


查看完整回答
反对 回复 2019-10-06
?
慕森卡

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;

}


查看完整回答
反对 回复 2019-10-06
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

SHA-1(和所有其他哈希算法)返回二进制数据。这意味着(在Java中)它们产生一个byte[]。这byte阵并没有表示任何特定的字符,这意味着你不能简单地把它变成一个String像你这样。

如果您需要一个String,则必须以byte[]一种可以表示为的方式对其进行格式化String(否则,请保留该位置byte[])。

代表任意byte[]可打印字符的两种常见方式是BASE64或简单的十六进制字符串(即,每个字符串byte由两个十六进制数字表示)。似乎您正在尝试生成十六进制字符串。

还有另一个陷阱:如果要获取Java的SHA-1 String,则需要将其转换Stringbyte[]第一个(因为SHA-1的输入byte[]也是)。如果仅myString.getBytes()按显示方式使用,那么它将使用平台默认编码,因此将取决于您在其中运行的环境(例如,它可能会根据操作系统的语言/区域设置返回不同的数据)。

更好的解决方案是指定要用于编码String-到- byte[]这样的转换:myString.getBytes("UTF-8")。在这里,选择UTF-8(或可以代表每个Unicode字符的另一种编码)是最安全的选择。


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 648 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信