OAuthでAPIを認証する際に問題があります。私はPythonでうまく動作することができますが、VB.Netでは動作しません。問題は、SHA1アルゴリズムがPythonとVB.NETで、同じメッセージだったと思っていたために別の値を返すということです。これは、メッセージに改行文字 "\ n"がある場合(API呼び出しのためにある必要があります)のように見えます。 Environment.NewLine
を使用しても役に立たないようです。HMAC SHA1用のVB.NETでの改行のエンコード
私は(this answerに基づいて)使用しているコードはここにある、私は私のPythonプログラムから取得する期待値と:
Public Sub Main()
' Expect D/5B78PD9pFhmqZQi3eenPBy6ks=
' Get D/5B78PD9pFhmqZQi3eenPBy6ks=
console.writeline(getHash("a", "msg"))
' Expect yuuq6RwtwkoJ6n3PquGFx60MLas=
' Get uv4AwQjvYeCTajhHw7EFtPlJfCE=
console.writeline(getHash("a", "msg\n"))
' Expect yuuq6RwtwkoJ6n3PquGFx60MLas=
' Get efRfAnmIN/C/YX/UPHVPFY5VjJg=
console.writeline(getHash("a", "msg" + Environment.NewLine))
End Sub
Public Function getHash(ByVal key As String, ByVal msg As String) As String
Dim myEncoder As New System.Text.UTF8Encoding
Dim keyBytes() As Byte = myEncoder.GetBytes(key)
Dim msgBytes() As Byte = myEncoder.GetBytes(msg)
Dim myHMACSHA1 As New System.Security.Cryptography.HMACSHA1(keyBytes)
Dim HashCode As Byte() = myHMACSHA1.ComputeHash(msgBytes)
Return Convert.ToBase64String(HashCode)
End Function
場合、それは便利です、私のPythonプログラムは次のとおりです。
import base64
import hashlib
import hmac
key = "a"
msg = "msg\n"
key_byte = key.encode('utf-8')
msg_byte = msg.encode('utf-8')
h = hmac.new(key_byte, msg_byte, hashlib.sha1)
print base64.b64encode(h.digest()) # yuuq6RwtwkoJ6n3PquGFx60MLas=
私の推測では、改行文字がどのようにコード化されているかとは関係がありますが、解決方法を理解することはできません。
はい、これは私が試したことです。私は 'vbLf'と 'Chr(10)'を使ってみましたが、宣言されていないと言います。どのモジュールが隠れているのかわかりません。 –
@PeterCollingridge:それらは 'Microsoft.VisualBasic'名前空間のどこかにあります。あなたのプロジェクトが 'Microsoft.VisualBasic.dll'を参照していることを確認してください。 –
私は現在オンラインインタープリタ(https://dotnetfiddle.net/)でテスト中です。おそらく、何らかの理由でそこには存在しないかもしれません。私はVisual Studioで試すことができます。 –