【问题标题】:how to get sha256 hashed string in erlang?如何在erlang中获取sha256散列字符串?
【发布时间】:2015-09-09 09:20:45
【问题描述】:

我正在尝试在 erlang 中通过 sha256 加密字符串,但我无法取回字符串。 crypto:hash(sha256, somestring) 给出了一些二进制文件,我怎样才能得到字符串?

【问题讨论】:

    标签: cryptography erlang sha256


    【解决方案1】:

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

    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"
    

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

    【讨论】:

    • 或者更简单:L = integer_to_list(X, 16).
    • @SteveVinoski: integer_to_list(X, 16) 可能会意外地以较短的字符串结束。
    • 是的。但在这种情况下只检查第一个字节:B = &lt;&lt;B0:8,_/binary&gt;&gt; = crypto:hash(sha256,"somenewstring"), &lt;&lt;X:256/big-unsigned-integer&gt;&gt; = B, L = case B0 &lt; 10 of true -&gt; [$0|integer_to_list(X,16)]; false -&gt; integer_to_list(X,16) end.
    • @SteveVinoski: 例如"li" 有SHA256 00A9E4255A5B63067B76CBFB9FD67F26BDB91BE802D5FFCB177EC1B7A8D4C623"efj"00080A3203FE58F70B16E857765FF5C7BEAD5A9B7A9E9DD2B85ADC4CA124B9D4"suo"0001342CA3E5723F55ECE7107F92B39DB6B99BF0816B9509C7FD50E11A138308"vkq" 有@9876543376@ 和@ 000E50E0F8CF93D9FA8C6437F681A3810F71E2B159C8E02433BEF470D45CF5AE
    • 啊,好点子。您仍然可以只填充前导零,但要完全通用,您需要遍历字节,直到找到一个 >= 16 或者您发现它们都是 0。但是在这一点上,您最好理解一下就像你的回答一样。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 2011-07-28
      • 2011-06-09
      • 2020-11-21
      • 2018-06-12
      • 2012-02-15
      • 2018-12-30
      • 2021-03-07
      • 2020-01-01
      相关资源
      最近更新 更多