【问题标题】:Java SHA-1 hash an unsigned BYTEJava SHA-1 散列一个无符号字节
【发布时间】:2012-02-22 10:07:46
【问题描述】:

大家好!

我有以下问题: 我需要在 Java 中散列一个无符号字节,它是(将是......)在 0-255 之间。 主要问题是java根本没有无符号字节类型。 我找到了一个解决方法,并使用 int 而不是 byte 稍作修改。

主要问题是:Java.securitys Messagedigest.digest 函数只接受字节数组类型,但我需要给它一个 int 数组。

有人对此有简单的解决方法吗? 我正在寻找第三方 sha-1 功能,但没有找到。也没有任何示例代码。

所以基本上我需要什么: 例如,我有一个无符号字节值:0xFF,需要获取以下 sha1 哈希:85e53271e14006f0265921d02d4d736cdc580b0b

任何帮助将不胜感激。

【问题讨论】:

    标签: java byte unsigned sha1


    【解决方案1】:

    了解有符号字节和无符号字节在表示方面没有区别,这一点很重要。符号是关于算术运算如何处理字节(除了加减法,在 2 的补码表示的情况下)。

    因此,如果您使用 bytes 进行数据存储,您只需确保在将值转换为 bytes 时将它们视为无符号(使用 (byte) 的显式转换,第 1 点)和来自bytes(防止符号扩展& 0xff,第2点):

    public static void main(String[] args) throws Exception {    
        byte[] in = { (byte) 0xff }; // (1)
        byte[] hash = MessageDigest.getInstance("SHA-1").digest(in);
        System.out.println(toHexString(hash));
    }
    
    private static String toHexString(byte[] in) {
        StringBuilder out = new StringBuilder(in.length * 2);
        for (byte b: in)
            out.append(String.format("%02X", b & 0xff)); // (2)
        return out.toString();
    }
    

    【讨论】:

    【解决方案2】:

    摘要不会关心 Java 如何感知字节的符号;它只关心字节的位模式。试试这个:

    MessageDigest digest = MessageDigest.getInstance("SHA-1");
    digest.update((byte) 0xFF);
    byte[] result = digest.digest();
    
    StringBuilder buffer = new StringBuilder();
    for (byte each : result)
        buffer.append(String.format("%02x", 0xFF & each));
    System.out.println(buffer.toString());
    

    这应该打印85e53271e14006f0265921d02d4d736cdc580b0b

    【讨论】:

      【解决方案3】:

      查看Apache Commons Codec 库,方法DigestUtils.sha(String data)。它可能对你有用。

      【讨论】:

      • 谢谢你们的快速帮助!
      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多