Вопрос по hash, sha1, ios, objective-c, .net – Хеш SHA1 дает разные результаты в Objective-C и C # .NET

1

В основном я хочу написать функцию, которая вычисляет хэш sha1.

Пока что я попробовал это следующим образом.

C # .NET

byte[] p2 = System.Text.Encoding.Unicode.GetBytes("password");
System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] result = sha.ComputeHash(p2);
string encodedPassword = Convert.ToBase64String(result);

Выход : 6Pl / upEE0epQR5SObftn + s2fW3M =

Objective-C

Я добавил классы для Base64 изNSData_Base64 Ссылка на классы.

NSString *password = @"password";
NSData *data = [password dataUsingEncoding:NSUTF8StringEncoding];
NSString *unicodePassword = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];
data = [unicodePassword dataUsingEncoding:NSUnicodeStringEncoding];


unsigned char hash[CC_SHA1_DIGEST_LENGTH];
CC_SHA1([data bytes], [data length], hash);
NSData *result = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
NSLog(@"Result: %@",[result base64EncodedString]);

Выход : dYusXVhObIBzJMgg1E1FJ9cK1NY =

Кто-нибудь может подсказать, пожалуйста, что я делаю не так?

Почему эти два значения отличаются?

Пожалуйста, исправьте мои ошибки.

может быть "NSData_Base64 Справочник классов " работает с безопасным URL base64, но C # .NETs System.Security.Cryptography.SHA1 работает с URL-небезопасным? Попробуйте использовать онлайн-шифраторы / расшифровщики SHA1 для сравнения результатов. Я предлагаю использовать GData Base64, который можно найти здесь:code.google.com/p/gdata-objectivec-client. art-divin

Ваш Ответ

2   ответа
1

Для получения дополнительной информации я обнаружил, что функция SHA1 может иметь некоторые результаты.

Итак, я реализовал методы по этой ссылке:Реализация MD5 и SHA1 для iOS связаныэтот вопрос

и я уточняю это своей интеграцией, которая отправляет в качестве параметров, если вы отправляете строку в кодировке UTF8 или нет (Unicode One) и если вы хотите шестнадцатеричную или десятичную строку

- (NSString*) sha1UTF8Encoding:(BOOL)utf8 andDecimal:(BOOL)decimal
{
    const char *cstr;
    if (utf8) {
        cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
    }else{
        cstr = [self cStringUsingEncoding:NSUnicodeStringEncoding];
    }
    NSData *data = [NSData dataWithBytes:cstr length:self.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++){
        if (decimal) {
            [output appendFormat:@"%i", digest[i]];
        }else{
            [output appendFormat:@"%02x", digest[i]];
        }
    }

    return output;    
}

(Обратите внимание, что я реализовал этот метод в категории NSString)

С этим я проверил, что вы можете использовать его для многих целей операции sha1, например, с этой конфигурацией:

NSString* sha1 = [stringToTest sha1UTF8Encoding:YES andDecimal:YES];

Переменная sha1 соответствует одному продукту методом C #, найденным по этой ссылке:Хеширование с использованием класса SHA1

3

Эта строка неверна, так как вы интерпретируете данные в кодировке UTF8, как если бы они были закодированы в Unicode:

NSString *unicodePassword = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];

Замените вторую строку на:NSData *data = [password dataUsingEncoding:NSUnicodeStringEncoding];

2 первых байта в данных - это спецификация (метка порядка байтов).

Удалите эти 2 байта сdata = [NSData dataWithBytes:[data bytes] + 2 length:[data length] - 2];

... а затем хешировать эти данные, у вас будет тот же хеш, что и в C #.

Я пробовал, но не работает вывод RsVAbAblCcyoeiKAeH + 6zWWZ6Ok = сейчас. βhargavḯ
Вот это да!!! спасибо это работает. Можете ли вы уточнить, что такое "Порядок следования байтов и как его обнаружить и устранить? βhargavḯ
Отредактировал пост о том, как удалить спецификацию. Markus
en.wikipedia.org/wiki/Byte_order_mark Markus

Похожие вопросы