Сгенерировать строку 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];
Это то, что я пытаюсь создать, и мне это очень сложно!
Я надеюсь, что кто-то может помочь.
Большое спасибо заранее,
Ответы
Ответ 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]
.