十六进制字符串的SHA1哈希值

3
我正在尝试使用Java安全库对十六进制字符串表示的数字进行哈希。也就是说,如果我有一个字符串"AABBCCDD",我想要将它哈希为四个字节-0xAA,0xBB,0xCC,0xDD,而不是作为ASCII输入处理,即0x65、0x65、0x66、0x66、0x67、0x67、0x68、0x68。我已经成功地对低值(如"112233445566")进行了操作(因为Java中的字节是有符号的),但在高值方面失败了。
有人知道如何实现这样的功能吗?
谢谢, Binyamin

有没有一种以 byte[] 作为输入的方法?我不太确定我理解问题是什么。 - user166390
是的,我想在实现过程中犯了一些错误。 - MByD
2个回答

6

首先,使用例如这个方法将你的十六进制转换为byte[]

然后,使用:

byte[] data = hexStringToByteArray(hexData);
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(data, 0, data.length);
byte[] sha1hash = md.digest();

我之前已经为RC4实现了hexStringToByteArray(),但由于某种原因,我忘记了它的存在并尝试以一种不同的(更复杂和低效的)方式解决它。谢谢。 - MByD
为什么要创建一个字节数组,然后有效地将其丢弃?当您调用md.digest()时,只需在最后一行声明sha1Hash即可。 - Jon Skeet
(修复了text.length()的奇怪用法。) - Jon Skeet
确实,修复了sha1hash错误。 - gleber

2
基本上,你只需要找到一个十六进制解析器 - 有很多这样的工具可用,例如这个或者Apache Commons Codec,可以进行其他转换。虽然Java字节确实是带符号的,但你将得到与无符号字节相同的位模式,因此它们将以相同的方式处理。除非你自己对字节值执行算术/位移操作,否则你通常可以忽略Java中字节是带符号的这一事实。请注意保留HTML标签。

谢谢,正如我之前写给gleber的那样,我已经实现了你的第一个选项。 - MByD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接