当前位置: 首页 > 面试题库 >

如何在Android中计算字符串的SHA-256哈希?

游炳
2023-03-14
问题内容

我正在尝试在Android中获取字符串的SHA256。

这是我要匹配的PHP代码:

echo bin2hex(mhash(MHASH_SHA256,"asdf"));
//outputs "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b"

现在,在Java中,我正在尝试执行以下操作:

            String password="asdf"
            MessageDigest digest=null;
    try {
        digest = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
       digest.reset();
       try {
        Log.i("Eamorr",digest.digest(password.getBytes("UTF-8")).toString());
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

但这会打印出来:“ a42yzk3axdv3k4yh98g8”

我在这里做错了什么?

归功于erickson:

 Log.i("Eamorr",bin2hex(getHash("asdf")));

 public byte[] getHash(String password) {
       MessageDigest digest=null;
    try {
        digest = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
       digest.reset();
       return digest.digest(password.getBytes());
 }
static String bin2hex(byte[] data) {
    return String.format("%0" + (data.length*2) + "X", new BigInteger(1, data));
}

问题答案:

PHP函数bin2hex意味着它需要一个字节字符串并将其编码为十六进制数字。

在Java代码中,您尝试获取一堆随机字节,并使用平台的默认字符编码将它们解码为字符串。那是行不通的,如果成功了,那将不会产生相同的结果。

这是针对Java的快速而肮脏的二进制到十六进制转换:

static String bin2hex(byte[] data) {
    StringBuilder hex = new StringBuilder(data.length * 2);
    for (byte b : data)
        hex.append(String.format("%02x", b & 0xFF));
    return hex.toString();
}

写起来 很快,但执行起来不一定很快。如果您要执行许多操作,则应使用更快的实现重写函数。



 类似资料:
  • 行是我构造字符串并将其转换为byte[]以转换为SHA-256散列的地方,其中tmpSessionId是我从HTTP请求中获取的值。产生的散列将在以后的请求中发送。

  • 问题内容: 现在,Amazon Product API在我尝试生成ushing Python的每个请求中都需要签名。 我挂断的步骤是这一步: “使用上面的字符串与我们的“虚拟”秘密访问密钥:1234567890,使用SHA256哈希算法计算符合RFC 2104的HMAC。有关此步骤的更多信息,请参见编程语言的文档和代码示例。” 给定字符串和私钥(在本例中为1234567890),如何使用Pytho

  • 现在我可以成功登录了。 现在,我如何以编程方式(在Java中)生成SHA-256哈希密码插入数据库?我见过许多生成SHA-256散列和将字节字符串转换为十六进制的示例。但是在使用摘要工具时,让我感到困惑的部分是散列的开始。它总是以“$”开头生成哈希值。当以编程方式转换哈希并用十六进制编码时,输出中永远不会包含'$'字符(因为十六进制中没有'$',只有0-F)。但是Tomcat似乎可以很好地处理摘要

  • 我正在尝试使用亚马逊的弹性代码转换器。这里我需要sha-256散列一个字符串;http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html 我已经尝试了我在网上找到的任何方法,但我找不到与页面和一些在线哈希网站提供的相同的结果。 下面是要散列的字符串,您可以从上面的链接中找到; 以下是预期结果: 3

  • 问题内容: 我需要计算大文件(或其一部分)的SHA-256哈希。我的实现工作正常,但比C 的CryptoPP计算要慢得多(25分钟vs. 30 GB文件的10分钟)。我需要的是在C 和Java中执行时间相似,因此散列几乎可以同时准备好。我也尝试了Bouncy Castle的实现,但是它给了我相同的结果。这是我如何计算哈希值: 问题答案: 我的解释可能无法解决您的问题,因为它很大程度上取决于您的实际

  • 问题内容: 我想知道如何手动计算给定字符串的哈希码。我了解在Java中,您可以执行以下操作: 一切都很好,但我想知道如何手工完成。我知道给定的公式来计算字符串的哈希码是这样的: 其中,S表示字符串中的字符,n是字符串的长度。然后使用16位unicode,来自字符串me的第一个字符将计算为: 然而,这产生了惊人的数量。我无法想象像这样将所有字符加在一起。那么,为了计算最低阶的32位结果,我该怎么办?