问题 用于在Android上生成HMAC-SHA1 OAuth签名的库?


使用 规格 下面我需要在Android上创建一个oauth_signature。我正在寻找一个处理锅炉板代码的库,用于创建通过OAuth访问资源的签名。

  1. 构造一个签名“基本字符串”,它由三个请求元素的串联组成:

    • HTTP请求方法。
    • 请求发送到的基本URL。此URL不应包含任何查询参数。在签署对Google服务的调用时,请参阅OAuth规范第9.1.2节,了解相关说明。
    • 请求中参数的标准化字符串(不包括oauth_signature参数)。这包括请求标头或正文中发送的参数,以及添加到请求URL的查询参数。要规范化字符串,请使用词典字节值排序对参数进行排序。有关规范化此字符串的更多详细信息,请参阅OAuth规范的第9.1.1节。
  2. 使用以下序列之一生成oauth_signature:

    • 如果您的应用程序已注册且您正在使用HMAC-SHA1,请使用注册期间生成的OAuth“consumer secret”值;此值显示在您域的注册页面上。

9407
2018-05-13 21:27


起源



答案:


我已将此库用于Android OAuth客户端: http://code.google.com/p/oauth-signpost/ 


0
2018-05-13 21:37



刚做了一些测试,虽然不是理想的访问GAE端点,但它的工作原理!谢谢。 - Will Curran
@WillMerydith但这不能用于.net或LinkedIn api - ManishSB


答案:


我已将此库用于Android OAuth客户端: http://code.google.com/p/oauth-signpost/ 


0
2018-05-13 21:37



刚做了一些测试,虽然不是理想的访问GAE端点,但它的工作原理!谢谢。 - Will Curran
@WillMerydith但这不能用于.net或LinkedIn api - ManishSB


回答Will对Chris的回答的问题,您可以使用内置的android javax.crypto.mac使用以下代码生成hmacsha1签名(标准Java JCE提供程序apis):

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);

你想要编码的文字“秘密”在哪里,上面的“结果”将是你的哈希编码签名。


10
2017-12-31 23:44



Base64.encodeBase64() 来自Apache的软件包,它在android中不存在。代替, Base64.encode(string,flag) 应该使用。 - Mahm00d
thanx @ Mahm00d,我更新了我的答案。我还将标志参数设置为DEFAULT以获取默认编码设置(developer.android.com/reference/android/util/Base64.html) - DEzra


我对OAuth一无所知,但你可以使用 javax.crypto.Mac 生成HMAC-SHA1值(使用 HmacSHA1 作为算法名称):

Mac hmac = Mac.getInstance("HmacSHA1");

1
2018-05-13 21:32



那个Object如何用于创建签名?在文档中似乎并不清楚。 - Will Curran


这是我用过的代码, 只需将值和键传递给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);
    }

1
2017-09-06 08:58



参数是什么?价值和关键? - Subin Babu
@SubinBabu。为了创建一个hmacsha1,你需要提供两个params一个键和一个消息,这两个的值将取决于你的用例。 - Muneef M
stackoverflow.com/q/49505888/6299045 - Subin Babu
对于Magento API,我们在服务器端传递的是Consumer Secret和Token Secret - Subin Babu
对于Oauth,我不认为你应该通过CS和TS。您需要连接一组URL编码的属性和参数来构造签名基本字符串。请参考 - devdocs.magento.com/guides/v2.0/get-started/authentication/... - Muneef M