Библиотека для генерации сигнатуры OAuth HMAC-SHA1 на Android?

Используя спецификации ниже, мне нужно создать oauth_signature на Android. Я ищу библиотеку, которая обрабатывает код плиты котла, создавая подпись для доступа к ресурсам через OAuth.

  • Построить сигнатурную "базовую строку", которая состоит из конкатенации трех элементов запроса:

    • Метод HTTP-запроса.
    • Базовый URL, на который отправляется запрос. Этот URL-адрес не должен содержать никаких параметров запроса. При подписке на звонки в службы Google обратитесь к спецификации 9A.1.2 OAuth для соответствующих инструкций.
    • Нормализованная строка параметров в запросе (исключая параметр oauth_signature). Сюда входят параметры, отправленные в заголовок или тело запроса, а также параметры запроса, добавленные к URL-адресу запроса. Чтобы нормализовать строку, сортируйте параметры, используя упорядочение значений лексикографического байта. Более подробную информацию о нормализации этой строки см. В разделе 9.1.1 спецификации OAuth.
  • Создайте знак oauth_signature, используя одну из следующих последовательностей:

    • Если ваша заявка зарегистрирована и вы используете HMAC-SHA1, используйте значение "секретность потребителя" OAuth, созданное во время регистрации; это значение отображается на странице регистрации домена.

Ответ 2

В ответ на вопрос "Ответ на вопрос Криса" вы можете использовать встроенный 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);

Где "секрет" будет текст, который вы хотите закодировать, а "результат" выше - ваша кодированная хэш-подпись.

Ответ 3

Я ничего не знаю об OAuth, но вы можете использовать javax.crypto.Mac для генерации значения HMAC-SHA1 (используйте HmacSHA1 как имя алгоритма):

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

Ответ 4

Вот код, который я использовал, просто передайте значение и ключ в 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);
    }