2015-01-16 4 views
1

Мне нужна помощь с поколениями заголовков WSSE в iOS. Приложение написано на Symfony2, которое использует sha512 алгоритм с 5000 итераций и encode_as_base64 как истинный. Для мобильного приложения я нашел этот вопрос для кодирования пароля: SHA512 with salt for iOS, хотя это только одна итерация. Использовать простой цикл, который включает в себя последний, достаточно?Как использовать WSSE в iOS с соленым sha512 с более чем 1-й итерацией

Мы нашли код для Android поколения заголовков WSSE: http://obtao.com/blog/2013/09/how-to-use-wsse-in-android-app/ Можно сделать то же самое в iOS, или мы должны найти другой способ аутентификации, например OAuth2?

ответ

5

Если вы хотите воспроизвести такое же шифрование как Symfony2 с 5000 итераций, вы можете использовать следующий код:

- (NSString *)hashPassword:(NSString *)password ansSalt:(NSString *)salt { 

    NSString *passwordSalted = [NSString stringWithFormat:@"%@{%@}",password,salt]; 

    NSData *passwordData = [passwordSalted dataUsingEncoding:NSUTF8StringEncoding]; 

    uint8_t hash[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512([passwordData bytes], [passwordData length], hash); 

    NSMutableData *allData = [[NSMutableData alloc] init]; 
    [allData appendBytes:hash length:CC_SHA512_DIGEST_LENGTH]; 

    for (NSInteger i = 1; i < 5000; i++) { 

     [allData appendBytes:[passwordData bytes] length:[passwordData length]]; 
     uint8_t hashLoop[CC_SHA512_DIGEST_LENGTH]; 
     CC_SHA512([allData bytes], [allData length], hashLoop); 
     [allData setLength:0]; 
     [allData appendBytes:hashLoop length:CC_SHA512_DIGEST_LENGTH]; 

    } 

    NSData *imageData = [NSData dataWithBytes:[allData bytes] length:[allData length]]; 

    return [imageData base64EncodedStringWithOptions:0]; 

} 

не забыл импортировать CommonDigest.h:

#import <CommonCrypto/CommonDigest.h> 
0

Для SHA512 попробуйте следующее:

#import <CommonCrypto/CommonDigest.h> 
    + (NSData *)sha512:(NSData *)data { 
    unsigned char hash[CC_SHA512_DIGEST_LENGTH]; 
    if (CC_SHA512([data bytes], [data length], hash)) { 
     NSData *sha512 = [NSData dataWithBytes:hash length:CC_SHA512_DIGEST_LENGTH];   
     return sha512; 
     } 
     return nil; 
    } 

для заголовков WSSE проверить https://github.com/laiso/CocoaWSSE

+0

Спасибо ... Я не знал о CocoaWSSE. О sha512, это только одна итерация, не так ли? – sergio

+0

Да, от проверки веб-сайта, который вы предоставили, кажется, что соль просто добавляет его в конце пароля открытого текста, дополненного «{» и «}», поэтому ... user_password + "{" + salt + "}" это что вам нужно будет предоставить методу, и вам нужно будет сначала преобразовать его в массив байтов. – Joe

+0

'salted = clearPassword +" {"+ salt +"} "; для (int i = 1; i <5000; i ++) { байт c [] = новый байт [sha.length + salted.getBytes(). Length]; System.arraycopy (sha, 0, c, 0, sha.length); System.arraycopy (salted.getBytes(), 0, c, sha.length, salted.getBytes(). Length); sha = md.digest (c); } 'С веб-сайта он выполняет итерацию 5000 раз. – sergio