2012-01-19 2 views
1

Мы пытаемся дублировать криптографическую кодировку sha1, выполненную на нашем сервере java 1.6, с библиотеками CommonCrypto iOS/iPhone.Разница между кодировкой SHA-1 между Java и iOS/iPhone

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

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

How to SHA1 hash a string in Android?

+0

это является неправдой утверждения прошивки. SHA1 * должен * иметь размер 40 байт. Вы должны разместить свой соответствующий код. – vcsjones

+0

@vcsjones, SHA1 составляет * 20bytes * в длину, если вы посмотрите на hexdump - 40., но SHA или любое другое хеширование не имеет ничего общего с w/hex. – bestsss

+0

@ bestsss Bha, потерял рассудок. Не могу исправить это сейчас. Да, ** 20 ** байт правильный. – vcsjones

ответ

2

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

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

Чтобы сравнить это с CommonCrypto вы можете:

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

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

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

+0

это правильный ответ :) – bestsss

+0

Наш разработчик iphone обнаружил ошибку в своем коде, и связанный пример из начального сообщения действительно работает. Спасибо за помощь! –

+0

Можно ли исправить ошибку в iOS/iPhone? Если я преобразовываю вывод SHA1 в байтовый массив или любым другим способом ??? – DShah

0

Вчера я столкнулся именно с этой проблемой, реализация алгоритма sha1, которую я использовал, не была совместима с андроидным, после более или менее одного часа поиска в реализациях android и ios, я понимаю, что это была только проблема String форматирование. (измените 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; 

} 
+0

Когда ввод представляет собой строку юникода, содержащую фигурные кавычки (например), метод objC sha1 выше возвращает неверное значение sha1. Чтобы исправить это, замените первые две строки этого метода на NSData * data = [input dataUsingEncoding: NSUTF8StringEncoding]; – lifjoy

0

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

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

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

Так что я думаю, дело в том, чтобы не использовать длину выходной ша для формирования выходных данных, а константа 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)]; 

Надеется, что это помогает, ура :)

Смежные вопросы