用于在 Android 上生成 HMAC-SHA1 OAuth 签名的库?
Posted
技术标签:
【中文标题】用于在 Android 上生成 HMAC-SHA1 OAuth 签名的库?【英文标题】:Library for generating HMAC-SHA1 OAuth signature on Android? 【发布时间】:2011-08-25 06:32:58 【问题描述】:使用下面的specifications,我需要在 android 上创建一个 oauth_signature。我正在寻找一个库来处理样板代码,以创建通过 OAuth 访问资源的签名。
构造一个签名“基本字符串”,它由三个请求元素的串联组成:
HTTP 请求方法。 请求发送到的基本 URL。此 URL 不应包含任何查询参数。签署对 Google 服务的调用时,请参阅 OAuth 规范的第 9.1.2 节,了解相关说明。 请求中参数的规范化字符串(不包括 oauth_signature 参数)。这包括在请求标头或正文中发送的参数,以及添加到请求 URL 的查询参数。要规范化字符串,请使用字典字节值排序对参数进行排序。有关规范化此字符串的更多详细信息,请参阅 OAuth 规范的第 9.1.1 节。使用以下序列之一生成 oauth_signature:
如果您的应用程序已注册并且您正在使用 HMAC-SHA1,请使用注册期间生成的 OAuth“消费者机密”值;此值显示在您的域的注册页面上。
【问题讨论】:
【参考方案1】:在回答 Will 关于 Chris 的问题时,您可以使用内置的 android javax.crypto.mac 使用以下代码(标准 Java JCE 提供程序 api)生成 hmacsha1 签名:
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm());
mac.init(secret);
byte[] digest = mac.doFinal(baseString.getBytes());
byte[] result=Base64.encode(digest, DEFAULT);
“秘密”将是您想要编码的文本,而上面的“结果”将是您的哈希编码签名。
【讨论】:
Base64.encodeBase64()
来自 Apache 的包,它在 android 中不存在。相反,应该使用Base64.encode(string,flag)
。
thanx @Mahm00d,我已经更新了我的答案。我还将标志参数设置为 DEFAULT 以获取默认编码设置 (developer.android.com/reference/android/util/Base64.html)【参考方案2】:
我对OAuth一无所知,但是您可以使用javax.crypto.Mac
生成HMAC-SHA1值(使用HmacSHA1
作为算法名称):
Mac hmac = Mac.getInstance("HmacSHA1");
【讨论】:
该对象是如何用于创建签名的?文档中似乎不清楚。【参考方案3】:这是我使用的代码, 只需将值和键传递给 hmacSha1().. 它返回 hmacsha1 字符串;
private static String hmacSha1(String value, String key)
throws UnsupportedEncodingException, NoSuchAlgorithmException,
InvalidKeyException
String type = "HmacSHA1";
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), type);
Mac mac = Mac.getInstance(type);
mac.init(secret);
byte[] bytes = mac.doFinal(value.getBytes());
return bytesToHex(bytes);
private final static char[] hexArray = "0123456789abcdef".toCharArray();
private static String bytesToHex(byte[] bytes)
char[] hexChars = new char[bytes.length * 2];
int v;
for (int j = 0; j < bytes.length; j++)
v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
return new String(hexChars);
【讨论】:
参数是什么?值和键? @SubinBabu 。要创建 hmacsha1,您需要提供两个参数,一个键和一个消息,这两个参数的值取决于您的用例。 对于 Magento API,我们在服务器端传递的是 Consumer Secret 和 Token Secret 对于 Oauth,我认为您不应该通过 CS 和 TS。您需要连接一组 URL 编码的属性和参数来构造签名基本字符串。请参考-devdocs.magento.com/guides/v2.0/get-started/authentication/…【参考方案4】:我已将此库用于 Android OAuth 客户端:http://code.google.com/p/oauth-signpost/
【讨论】:
刚刚做了一些测试,虽然不适合访问 GAE 端点,但它可以工作!谢谢。 @WillMerydith 但这不能用于 .net 或 LinkedIn api以上是关于用于在 Android 上生成 HMAC-SHA1 OAuth 签名的库?的主要内容,如果未能解决你的问题,请参考以下文章