2

一部のサイトでプライベート API 呼び出しを実行する関数を作成しようとしています。これらのサイトはすべて、php で次のように API 呼び出しの署名による認証を使用しています。

base64_encode( hash_hmac('sha512', $post_data, base64_decode($secret), true) )

パッケージ ダイジェストと RCurl を使用すると、次のように簡単に記述できます。

base64Encode( hmac(key = base64Decode(secret), object = post_data, algo = 'sha512', raw = TRUE) )

hmacキーパラメーター入力で一日中戦っています:

key = base64Decode(secret)

問題は、hmac 関数は文字列値のみを受け入れますが、base64Decode は単なる文字列以外のものを返す可能性があることです:

str(base64Decode(secret))
chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__

この__truncated__がここでの重要な問題です。だから私が試した次のことは、decode 関数と rawToChar から生の出力を取得することでした:

str(base64Decode(secret,mode='raw'))
raw [1:64] ee e3 3f be ...

rawToChar(base64Decode(secret,mode='raw'))

rawToChar(base64Decode(secret,mode='raw')) のエラー: 文字列に nul が埋め込まれています: 'îă?ľÂÜĄ\vŽĺ\022\0!^\026Č‹¶©wŚˇ0Î\035ë\026\r\001ňKÍ„Rř\ 003j„7¤Ň\nťä_\004m@ß\0Ă"c\0271˝ZnĚ55'v'

今見てわかるように、私の (まだ) 文字列のどこかに謎のヌルがあります。nul についてはあまり気にしません。このデータを hmac の入力として渡すだけで済みます。

  1. 入力上位関数として文字列をさらにプッシュするためだけに、文字列を nul で処理する可能性はありますか?
  2. hmac ファンクションキーパラメータにこのような生のオブジェクトを受け入れる可能性はありますか?

base64enc パッケージも試してみましたが、成功しませんでした。私は多くの異なる変換を試みましたが、すべてがこの単純な「文字列内のヌル」に戻っています。

これらのサイトはかなり新しく、この認証プロセスは標準の API 認証のように見えます。Rでそのプロセスを処理する方法が必要です。

テストしたい人がいたら、

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
4

2 に答える 2

2

質問 2. の答えは次のとおりです。

hmac 関数は、文字列の代わりに生のオブジェクトを既に受け入れています。

これが解決策です:

hmac(key = base64Decode(secret, mode='raw'),
 object = post_data,
 algo = 'sha512',
 raw = TRUE)
于 2013-02-20T09:20:35.167 に答える
1

これが問題なのかよくわかりませんtruncated。出力に適用strするときは、その構造を表示するように要求します。それはそれがすることです:

chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__

chrオブジェクトがクラスcharacter(文字列)であることを意味します。str次に、文字列の先頭を表示し、putはその出力を切り捨てます。したがって、truncatedによって表示されstrます。完全な文字列を表示する場合は、名前を入力するか、次を使用しますprint

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
str(base64Decode(secret))
# chr "\xee\xe3?\xbe\xc2ܥ\v\x8e\x98\xe5\022"

したがって、問題はbase64Decode関数ではなく、スクリプトの他の場所にあると思います。

于 2013-02-19T18:04:46.633 に答える