2017-06-08 3 views
0

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= 

私の推測では、改行文字がどのようにコード化されているかとは関係がありますが、解決方法を理解することはできません。

答えて

1

まず、VB.NETで\nが改行文字を表していないことを指摘したいと思います。文字通り、\nになります。

Environment.NewLineは現在のOSに適応します。オペレーティングシステムによって、異なる行末が使用されます。ここでの問題は、Pythonのコードは、新しい行の指標としてLine Feed文字(\n)が使用されていることですが、Environment.NewLineはOSに適応するので、それはCarriage Return + ラインフィード\r\n)で終わるWindowsの行を返します。

したがって、Pythonコードと一致させるには、改行コードのみを挿入してください。。たとえば、

Console.WriteLine(getHash("a", "msg" & vbLf)) 
+0

はい、これは私が試したことです。私は 'vbLf'と 'Chr(10)'を使ってみましたが、宣言されていないと言います。どのモジュールが隠れているのかわかりません。 –

+0

@PeterCollingridge:それらは 'Microsoft.VisualBasic'名前空間のどこかにあります。あなたのプロジェクトが 'Microsoft.VisualBasic.dll'を参照していることを確認してください。 –

+0

私は現在オンラインインタープリタ(https://dotnetfiddle.net/)でテスト中です。おそらく、何らかの理由でそこには存在しないかもしれません。私はVisual Studioで試すことができます。 –

関連する問題