2016-07-07 1 views
4

私はJavaを使用して符号付きリクエスト(SHA256base64)を作成し、このリクエストをPythonで検証しています。私は生成されたキーは、本当に似ています。PythonとJava MAC SHA256エンコーディングを生成するには

のJava:

UjuGTll3GF7H8MHWyJc41NAEcd-OZOeJLT9PiAevcsw 

のPython:

UjuGTll3GF7H8MHWyJc41NAEcd+OZOeJLT9PiAevcsw 

のみdiferenceがcha​​r +チャー-で発生します。私はそれにアクセスすることができないので、私はJavaコードを変更することはできません、私はそれがjavax.crypto.Macを使用することを知っている。しかし、私のPythonのコードは次のとおりです。

import hmac 
import hashlib 
hmac.new(api_secret, url, hashlib.sha256).digest().encode('base64') 

変数api_secreturlは、両方の言語(JavaPython)で同じ入力を持つ

私は何をしないのですか?

答えて

1

digest()は文字列を返しますので、encodeはちょうどstandard encode methodです。 standard encodingsのリストによれば、符号化にbase64を指定すると、base64.encodestringが使用されます。その関数によって使用されるアルファベットは最後の2つの文字は、標準のBase64アルファベットである+/を、含まれています

>>> base64.encodestring(chr(248)) 
'+A==\n' 

あなたの代わりに+/-_を使用してエンコードされた文字列をしたい場合は、必要にbase64.urlsafe_b64encode使用:

>>> base64.urlsafe_b64encode(chr(248)) 
'-A==' 

だからあなたがする必要があるだろう何かのように:

base64.urlsafe_b64encode(hmac.new(api_secret, url, hashlib.sha256).digest()) 

しかし、このコードを実行するには、/の代わりに_というコードをurlsafe_b64encodeの代わりに生成していることを確認する必要があります。

+0

ありがとう! –

関連する問題