11

使用下面的规范,我需要在 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“消费者机密”值;此值显示在您域的注册页面上。
4

4 回答 4

11

在回答 Will 对 Chris 的回答的问题时,您可以使用内置的 android javax.crypto.mac 使用以下代码(标准 Java JCE 提供程序 apis)生成 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);

其中“秘密”将是您想要编码的文本,而上面的“结果”将是您的哈希编码签名。

于 2011-12-31T23:44:32.927 回答
1

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

Mac hmac = Mac.getInstance("HmacSHA1");
于 2011-05-13T21:32:19.297 回答
1

这是我使用的代码,只需将值和键传递给 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);
    }
于 2015-09-06T08:58:14.440 回答
0

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

于 2011-05-13T21:37:15.197 回答