Подтвердить что ты не робот

Сгенерировать строку SHA256 в Objective C

Возможный дубликат:
Sha256 в Objective-C для iPhone

Привет,

У меня ужасная проблема с созданием строки SHA256 в Objective C (возможно, потому, что я так новичок в языке).

В jQuery все, что мне нужно сделать, это:

var sha256String=$.sha256("Hello");

который генерирует хеш, как ожидалось.

Но в Objective-C я пробовал следующее безрезультатно:

NSString *pword=[[NSString alloc]
initWithString:login_pword.text];
unsigned char result[64];
CC_SHA256([pword UTF8String], [pword lengthOfBytesUsingEncoding:NSASCIIStringEncoding],result);
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:result delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[msg show];
[msg release];

Есть ли какая-то функция, которую я могу назвать, например:

NSString *sha256String=[self getSHA256:pword];

Это то, что я пытаюсь создать, и мне это очень сложно!

Я надеюсь, что кто-то может помочь.

Большое спасибо заранее,

4b9b3361

Ответ 1

Вы передаете result в метод UIAlertView init. result - char[], а UIAlertView ожидает NSString*. Вам нужно преобразовать char[] в NSString *.

Попробуйте следующее:

NSString *resultString = [NSString stringWithCString:result encoding:NSASCIIStringEncoding];
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

Также см. эту статью о хэшировании на iPhone.

Ответ 2

После долгой игры сегодня я наконец придумал функцию для получения SHA256:

-(NSString*) sha256:(NSString *)clear{
    const char *s=[clear cStringUsingEncoding:NSASCIIStringEncoding];
    NSData *keyData=[NSData dataWithBytes:s length:strlen(s)];

    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0};
    CC_SHA256(keyData.bytes, keyData.length, digest);
    NSData *out=[NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    NSString *hash=[out description];
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
    return hash;
}

Это дает тот же результат, что и PHP. Его можно легко преобразовать в SHA1 - просто измените "SHA256" на "SHA1".

Надеюсь, что это поможет кому-то.

Ответ 3

Вам понадобятся функции OpenSSL C. См. Например этот вопрос о том, как это сделать. В качестве входной строки вы должны использовать [myString UTFString] с длиной [myString lengthOfBytesUsingEncoding:NSUTF8StringEncoding].