我正在尝试使用Android上的MAC访问身份验证来签署http标头。我正在使用位于此处的IETF草案#2:
http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-02(1)
使用草案的例子,变量是:
MAC key identifier: h480djs93hd8
MAC key: 489dks293j39
MAC algorithm: hmac-sha-1
Timestamp: 1336363200
Nonce: dj83hs9s
以下是规范化字符串:
1336363200\n
dj83hs9s\n
GET\n
/resource/1?b=1&a=2\n
example.com\n
80\n
\n
我使用以下方法编码mac标头:
private String calculateMAC(final String macAlgorithm, final String normalizedString, final String keyString) {
try {
final SecretKeySpec keySpec = new SecretKeySpec((keyString).getBytes("UTF-8"), macAlgorithm);
final Mac mac = Mac.getInstance(macAlgorithm);
mac.init(keySpec);
return Base64.encodeToString(mac.doFinal(normalizedString.getBytes("UTF-8")), Base64.NO_WRAP);
} catch (final Exception e) {
Log.e("Error", e.toString());
return null;
}
}
我遇到的问题是草案说得到的MAC是“bhCQXTVyfj5cmA9uKkPFx1zeOXM=
”。但无论我在尝试什么(不同的编码,差异库等),我总是有“6T3zZzy2Emppni6bzL7kdRxUWL4=
”。为什么?
(1)最新草案(http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-03)没有例子。因此,更难以遵循。
答案 0 :(得分:0)
我在两个不同的平台(php和C#)上尝试了相同的例子,看起来这个例子是不正确的(毕竟它是草稿)。正确的输出确实是“6T3zZzy2Emppni6bzL7kdRxUWL4=
”。