Разница в кодировке SHA-1 между Java и iOS / iPhone - PullRequest
1 голос
/ 20 января 2012

Мы пытаемся продублировать криптографическое кодирование sha1, выполненное на нашем сервере java 1.6, с библиотеками iOS / iPhone CommonCrypto.

Основной вопрос, который у меня возникает, заключается в том, почему Java имеет исправленный вывод 40 байтов, а iOSимеет исправленный вывод 20 байтов из алгоритмов SHA1

Я нашел эту ссылку, которая показывает, как генерировать кодировку в обеих средах, но вывод будет разной длины, верно?

Как SHA1 хэшировать строку в Android?

Ответы [ 3 ]

2 голосов
/ 20 января 2012

Алгоритм SHA1 всегда возвращает 160 бит (или 20 байтов).

Я подозреваю, что ваш Java-код превращает массив байтов в шестнадцатеричную строку, то есть, где каждый байт будет отображаться как два символа.

Для сравнения с CommonCrypto вы можете:

  • преобразовать вывод Java в байтовый массив; или

  • преобразовать байтовый массив CommonCrypto в шестнадцатеричную строку (это то, что делает ссылка в вашем вопросе)

перед сравнением значений.

0 голосов
/ 03 ноября 2015

Android или iOS, SHA-1 имеет ожидаемую длину 20 байт.

Но есть разница в возвращении алгоритма sha-1.

iOS просто не завершает результат нулевым символом.

Так что я думаю, что смысл не в том, чтобы использовать длину вывода sha для генерации выходных данных, а в константе CC_SHA1_DIGEST_LENGTH - которая равна 20.

uint8_t digest[CC_SHA1_DIGEST_LENGTH];
NSData* data = [stringToHash dataUsingEncoding:NSUTF8StringEncoding];
char* sha = CC_SHA1(data.bytes, data.length, digest);
NSData *hashedData = [NSData dataWithBytes:sha length:CC_SHA1_DIGEST_LENGTH];

Если вы сами завершите дайджест, то вывод ша будет правильным:

uint8_t digest[CC_SHA1_DIGEST_LENGTH+1];
memset(digest,0,CC_SHA1_DIGEST_LENGTH+1);
NSData* data = [stringToHash dataUsingEncoding:NSUTF8StringEncoding];
char* sha = CC_SHA1(data.bytes, data.length, digest);
NSData *hashedData = [NSData dataWithBytes:sha length:strlen(sha)];

Надеюсь, это поможет, ура :) 1013 *

0 голосов
/ 13 августа 2013

Вчера я столкнулся именно с этой проблемой, реализация алгоритма sha1, которую я использовал, была несовместима с Android, после более или менее одного часа поиска на реализациях Android и IOS, я понимаю, что это была только проблема форматирования строк , (изменить X на x).

Я делюсь фрагментом того, что мы используем для реализации алгоритма sha1, совместимого с ios / android ... Надеюсь, это поможет в качестве версии ответа теории @poupou :-).

public static String sha1(String s) {
    MessageDigest digest = null;
    try {
        digest = MessageDigest.getInstance("SHA-1");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    digest.reset();
    byte[] data = digest.digest(s.getBytes());
    return String.format("%0" + (data.length * 2) + "X", new BigInteger(1, data));
}


-(NSString*) sha1:(NSString*)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, data.length, digest);
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02X", digest[i]];
    return output;

}
...