在Mathematica中以字符串形式给出的数据的加密哈希(sha1或md5)

时间:2009-12-06 05:59:50

标签: hash cryptography wolfram-mathematica

“abc”的sha1哈希是

a9993e364706816aba3e25717850c26c9cd0d89d

让Mathematica用Hash函数告诉你的唯一方法是

Hash[abc, "SHA"]   // IntegerString[#, 16]&

(IntegerString就像大多数实现一样以十六进制输出。)

请注意

Hash["abc", "SHA"]

给出了“\”abc \“”的哈希值 - 不是你想要的! 事实上,我们获得正确哈希“abc”的唯一原因是因为符号abc的Mathematica表示恰好是字符串“abc”。 对于绝大多数字符串,情况并非如此。

那么如何在Mathematica中获取任意字符串的哈希值?

2 个答案:

答案 0 :(得分:6)

使用StringToStream以及FileHash可以将输入流作为参数这一事实,您可以更少地执行此操作。然后您的sha1函数变为:

sha1[s_String] := Module[{stream = StringToStream[s], hash},
  hash = FileHash[stream,"SHA"];
  Close[stream];
  hash]

答案 1 :(得分:2)

这是一个有效的kludge。将字符串写入临时文件并使用FileHash

sha1[s_String] := Module[{stream, file, hash},
  stream = OpenWrite[];
  WriteString[stream, s];
  file = Close[stream];
  hash = FileHash[file, "SHA"];
  DeleteFile[file];
  hash]

您可能还想定义

hex = IntegerString[#, 16]&;

并在上面的函数中返回hex@hash