Java SHA-1哈希是一个未签名的BYTE

时间:2012-01-30 16:04:42

标签: java byte unsigned sha1

Hy guys!

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

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

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

基本上我需要的是: 我有一个无符号字节值,例如:0xFF,需要得到以下sha1哈希值:85e53271e14006f0265921d02d4d736cdc580b0b

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

重要的是要理解有符号和无符号字节之间的表示没有区别。签名是关于如何通过算术运算处理字节(除了加法和减法,在2的补码表示的情况下)。

因此,如果您使用byte进行数据存储,那么您只需要确保在将值转换为byte时将它们视为无符号(使用显式转换为(byte) },点1)和byte s(使用& 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();
}

答案 1 :(得分:1)

摘要不关心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

答案 2 :(得分:0)

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