在 Android 上生成 HMAC-SHA1 OAuth 签名的库?

发布于 2024-11-06 23:48:03 字数 697 浏览 6 评论 0原文

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

Using the specifications below I need to create an oauth_signature on Android. I'm looking for a library that handles the boiler plate code in creating a signature for accessing resources via OAuth.

  1. Construct a signature "base string", which consists of a concatenation of three request elements:

    • The HTTP request method.
    • The base URL the request is being sent to. This URL should not include any query parameters. When signing calls to Google services, refer to the OAuth specification, Section 9.1.2, for relevant instructions.
    • A normalized string of the parameters in the request (excluding the oauth_signature parameter). This includes parameters sent in the request header or body, as well as query parameters added to the request URL. To normalize the string, sort the parameters using lexicographical byte value ordering. For more details on normalizing this string, see Section 9.1.1 of the OAuth specification.
  2. Generate an oauth_signature using one of the following sequences:

    • If your application is registered and you're using HMAC-SHA1, use the OAuth "consumer secret" value generated during registration; this value is displayed on your domain's registration page.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

救赎№ 2024-11-13 23:48:03

在回答 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);

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

In answer to Will's question on Chris's answer, you could use the built in android javax.crypto.mac to generate the hmacsha1 signature using following code (standard Java JCE provider 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);

Where 'secret' would be you text you wanted to encode and 'result' above would be your hash encoded signature.

零度° 2024-11-13 23:48:03

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

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

I don't know anything about OAuth, but you can use javax.crypto.Mac to generate HMAC-SHA1 value (use HmacSHA1 as the algorithm name):

Mac hmac = Mac.getInstance("HmacSHA1");
我要还你自由 2024-11-13 23:48:03

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

Here is the code i used,
just pass the value and key to the hmacSha1().. it returns hmacsha1 string;

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);
    }
万劫不复 2024-11-13 23:48:03

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

I've used this library for an Android OAuth Client: http://code.google.com/p/oauth-signpost/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文