Cryptography 如何在erlang中获取sha256哈希字符串?

Cryptography 如何在erlang中获取sha256哈希字符串?,cryptography,erlang,sha256,Cryptography,Erlang,Sha256,我试图通过erlang中的sha256对字符串进行加密,但无法将字符串取回。crypto:hash(sha256,somestring)提供一些二进制文件,如何获取字符串?必须将二进制文件解码为整数,然后以十六进制形式打印: 1> io_lib:format("~64.16.0b", [binary:decode_unsigned(crypto:hash(sha256, "somenewstring"))]). "abf8a5e4f99c

我试图通过erlang中的sha256对字符串进行加密,但无法将字符串取回。crypto:hash(sha256,somestring)提供一些二进制文件,如何获取字符串?

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

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"
2>=crypto:hash(sha256,“somenewstring”)。
3> 整数。
77784820141105809005227607825327585337759244421257967593474620236757179950140
4> io_库:格式(“~64.16.0b”,[Integer])。
“abf8a5e4f99c89cabb25b4bfde8a1db5478da09bcbf4f1d9cdf90b7b5321e43c”

(请注意,
相当于
,因为它们是默认标志)。

在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")]

[element(C+1,{$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$B,$C,$D,$E,$F})甚至更简单:
L=integer\u to\u list(X,16)。
@SteveVinoski:
integer\u to\u-list(X,16)
可能意外地以较短的字符串结束。如果是这样,只需检查第一个字节:
B==crypto:hash(sha256,“somenewstring”),=B,L=true->[$0 | integer_to_list(X,16)]的情况B0<10;false->integer_to_list(X,16)结束。
@SteveVinoski:例如
“li”
有SHA256
00A9E4255A5B630677B76CBFB9FD67F26BD91BE802D5FFCB177EC1B7A8D4C623
“efj”
拥有
00080A3203FE58F70B16E857765FF5C7EAD5A9B7A9E9DD2B85ADC4CA124B9D4
“suo”
拥有
0001342CA3E5723F55ECE7107F92B39DB6B99BF0816B9509C7FD50E11A138308
“vkq”
拥有
0009E3AC3287DA1381A72613964030B9E569E5B9E
000e50e0e0f8cf93d9fa8c6437f681a3810f71e2b159c8e02433bef470d45cf5cf5ae
啊,很好的观点。你仍然可以用前导零填充,但要完全通用,你需要遍历字节,直到你找到一个>=16或者你发现它们都是0。但在这一点上,你最好像你的答案那样理解。