2015-09-16 7 views
5

私は、PHPと同じ値を持つエリクシールを使ってシグネチャを生成しようとしています。hmacを使ってエリクシールとPHPでシグネチャを生成

例えばPHPのコードは

$signature = base64_encode(hash_hmac("sha256", "abc", "def")); 

であり、出力は

Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==

あろうどのようにエリクシールにおいて同じ値を有する署名を生成すべきです。私は

以下
iex(9)> :crypto.hmac(:sha256, "abc", "def") |> Base.encode64       │ 
"IOvA8JNERwE081BA9j6pix2OQUISlJ7lxQBCnRXqsIE=" 

iex(10)> :crypto.hash(:sha256, :crypto.hmac(:sha256, "abc", "def")) |> Base.encode64 │ 
"dxGiPN6KqBJrtS2wlC4tnJXwUsWf4u1LPDtDFK+VT5A=" 

ような何かをしようとしたか、私はabcdef

iex(11)> :crypto.hash(:sha256, :crypto.hmac(:sha256, "def", "abc")) |> Base.encode64 │ 
"b+3P5oHu8e6HIlJe2MzcGhKm7tCcF/NE5wPIbEhrFGU=" 

iex(12)> :crypto.hmac(:sha256, "def", "abc") |> Base.encode64       │ 
"OX9Gc0Hk14xHSGfvMmHNtGwOEDUempiZY+bLLc5A7l0=" 

の位置を切り替える。しかしそれらのどれもが同じ値を持っていません。誰かが正しい方法でそれをする方法を教えてもらえますか?

答えて

4

hash_hmacは16進文字列を返し、:crypto.hmacはバイナリを返します。

エリクサーでの同等のコードは次のとおりです。

iex(1)> :crypto.hmac(:sha256, "def", "abc") |> Base.encode16 |> String.downcase |> Base.encode64 
"Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==" 

私たちは、PHPのhash_hmacは、下ケースa-fを返しながらBase.encode16は資本A-Fで16進数文字列を返すためString.downcaseを使用する必要があります。

+0

ありがとうございます!出来た!!! –

+3

文書をチェックアウトした後、 '... |> Base.encode16(case :: lower)|> Base.encode64'のような' String.downcase' –

関連する問題