【问题标题】:SHA1 Hash on Hex String十六进制字符串上的 SHA1 哈希
【发布时间】:2011-05-18 23:29:42
【问题描述】:

我正在尝试使用 Java 安全库对一个数字进行哈希处理,该数字由十六进制字符串表示。意思是,如果我有字符串“AABBCCDD”,我不想散列它,因为这是一个 ascii 输入,即 0x65、0x65、0x66、0x66、0x67、0x67、0x68、0x68,但作为四个字节 - 0xAA、0xBB、 0xCC,0xDD。 我设法用诸如“112233445566”之类的低值来做到这一点(因为字节是用Java签名的),但用高值失败了。

有人知道如何实现这样的事情吗?

谢谢, 宾亚明

【问题讨论】:

  • 这不是以byte[]为输入的方法吗?我不太确定我是否理解问题所在。
  • 是的。我想我之前在实现中犯了一些错误。

标签: java security sha1


【解决方案1】:

首先将您的十六进制转换为byte[],例如使用:Convert a string representation of a hex dump to a byte array using Java?

使用后

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

【讨论】:

  • 实际上我之前已经为 RC4 实现实现了 hexStringToByteArray(),但由于某种原因我忘记了它的存在并试图以不同的方式解决它(方式更复杂且效率低下)。谢谢。
  • 你为什么要创建一个字节数组然后有效地丢弃它?当您调用md.digest() 时,只需在最后一行声明 sha1Hash。
  • (也修正了 text.length() 的奇怪用法。)
  • Indded,修复了 sha1hash 错误
【解决方案2】:

基本上你只需要找到一个十六进制解析器 - 周围有很多,one example hereApache Commons Codec 用于此和其他转换。虽然 Java 字节确实是有符号的,但您会得到与无符号相同的位模式,因此它们的方式相同。除非您对字节值执行自己的算术/位移,否则您通常可以忽略字节在 Java 中签名的事实。

【讨论】:

  • 谢谢,当我写信给 gleber(上图)时,我已经实现了您的第一个选项。
猜你喜欢
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多