Почему мой код Android и Objective-C получают разные результаты hmac-sha1? - PullRequest
0 голосов
/ 01 июня 2018

Я пишу функцию, которая берет ключ и URL и генерирует подпись.Я использую hmac-sha1.Но я получил разные подписи между кодом Android и объективом-c:

Objective-C:

- (NSString *)hmacsha1:(NSString *)url secretKey:(NSString *)secretKey
{
    const char *cKey  = [secretKey cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [url cStringUsingEncoding:NSUTF8StringEncoding];

    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                          length:sizeof(cHMAC)];

    NSString *hash = [HMAC base64EncodedStringWithOptions:0];


    return hash;
}

Android:

public static String hmacsha1(String url, String secretKey) throws
        UnsupportedEncodingException, NoSuchAlgorithmException,
        InvalidKeyException
{
    secretKey = secretKey.replace('-', '+');
    secretKey = secretKey.replace('_', '/');

    byte[] key = Base64.decode(secretKey, Base64.DEFAULT);

    SecretKeySpec sha1Key = new SecretKeySpec(key, "HmacSHA1");

    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(sha1Key);

    byte[] sigBytes = mac.doFinal(url.getBytes());

    String signature = Base64.encodeToString(sigBytes, Base64.DEFAULT);

    // convert the signature to 'web safe' base 64
    signature = signature.replace('+', '-');
    signature = signature.replace('/', '_');

    return signature;
}

1 Ответ

0 голосов
/ 22 ноября 2018

Метод, с помощью которого я сгенерировал hmac-sha1 строку, точно такую ​​же, как строка Android

- (NSData *)hmacForKeyAndData:(NSString *)key data:(NSString *)url
    {
        const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
        const char *cData = [url cStringUsingEncoding:NSASCIIStringEncoding];
        unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
        CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
        return [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
    }
...