如何在Erlang中获取SHA256哈希字符串?

3

我正在尝试在Erlang中使用sha256加密字符串,但是我无法成功获取加密后的字符串。crypto:hash(sha256, somestring)返回一些二进制数据,如何才能得到字符串呢?

2个回答

11

必须将二进制编码解码为整数,然后以十六进制形式打印:

1> io_lib:format("~64.16.0b", [binary:decode_unsigned(crypto:hash(sha256,
 "somenewstring"))]).
"abf8a5e4f99c89cabb25b4bfde8a1db5478da09bcbf4f1d9cdf90b7b5321e43c"

binary:decode_unsigned/1 函数将整个二进制数据解码为一个大端无符号整数。另一种方法是将二进制数据模式匹配成一个整数:

2> <<Integer:256>> = crypto:hash(sha256, "somenewstring").
<<171,248,165,228,249,156,137,202,187,37,180,191,222,138,
  29,181,71,141,160,155,203,244,241,217,205,249,11,123,83,
  ...>>
3> Integer.
77784820141105809005227607825327585337759244421257967593474620236757179950140
4> io_lib:format("~64.16.0b", [Integer]).
"abf8a5e4f99c89cabb25b4bfde8a1db5478da09bcbf4f1d9cdf90b7b5321e43c"

(请注意,<<Integer:256>> 等同于 <<Integer:256/big-unsigned-integer>>,因为它们是默认标志。)


5
更简单的写法:L = integer_to_list(X, 16),意思是将整数X转换为16进制表示的列表L。 - Steve Vinoski
1
@SteveVinoski:integer_to_list(X, 16) 可能会意外地得到一个较短的字符串。 - Hynek -Pichi- Vychodil
返回翻译的文本:在这种情况下,为真。但只检查第一个字节:B = <<B0:8,_/binary>> = crypto:hash(sha256,"somenewstring"), <<X:256/big-unsigned-integer>> = B, L = case B0 < 10 of true -> [$0|integer_to_list(X,16)]; false -> integer_to_list(X,16) end. - Steve Vinoski
@SteveVinoski:例如,"li"的SHA256为00A9E4255A5B63067B76CBFB9FD67F26BDB91BE802D5FFCB177EC1B7A8D4C623,"efj"的SHA256为00080A3203FE58F70B16E857765FF5C7BEAD5A9B7A9E9DD2B85ADC4CA124B9D4,"suo"的SHA256为0001342CA3E5723F55ECE7107F92B39DB6B99BF0816B9509C7FD50E11A138308,"vkq"的SHA256为0009E3AC3287DA952D1381A7261396404033091FFE56A0E569B9B1409CD4E5EE,"xym"的SHA256为000E50E0F8CF93D9FA8C6437F681A3810F71E2B159C8E02433BEF470D45CF5AE。 - Hynek -Pichi- Vychodil
啊,说得好。你仍然可以用前导零填充,但为了完全通用,你需要遍历字节,直到找到一个大于等于16的字节或者发现它们全部都是0。但在那个时候,你最好使用像你答案中那样的推导式。 - Steve Vinoski

3

在Erlang中获取sha256哈希字符串的另一种方法:

[ element(C+1, {$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$B,$C,$D,$E,$F}) || <<C:4>> <= crypto:hash(sha256,"somenewstring")]

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