Как я могу вычислить хэш SHA-2 (в идеале SHA 256 или SHA 512) в iOS?
API служб безопасности не позволяет мне напрямую вычислять хеш. Существует множество доступных для общественности и свободно лицензированных версий, но я предпочел бы использовать реализацию системной библиотеки, если это возможно.
Данные доступны через NSData или простые указатели.
Криптографическая сила хеша важна для меня. SHA-256 - минимально допустимый размер хэша.
Ответы
Ответ 1
Это то, что я использую для SHA1:
+ (NSData *)sha1:(NSData *)data {
unsigned char hash[CC_SHA1_DIGEST_LENGTH];
if ( CC_SHA1([data bytes], [data length], hash) ) {
NSData *sha1 = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
return sha1;
}
return nil;
}
Замените CC_SHA1
на CC_SHA256
(или в зависимости от того, что вам нужно), а также CC_SHA1_DIGEST_LENGTH
с CC_SHA256_DIGEST_LENGTH
.
Вам нужно #import <CommonCrypto/CommonDigest.h>
Ответ 2
Здесь довольно похожий на NSString
+ (NSString *)hashed_string:(NSString *)input
{
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
// This is an iOS5-specific method.
// It takes in the data, how much data, and then output format, which in this case is an int array.
CC_SHA256(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
// Parse through the CC_SHA256 results (stored inside of digest[]).
for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
(Кредиты переходят к http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1)
Ответ 3
Это то, что сработало для меня
func sha256(securityString : String) -> String {
let data = securityString.dataUsingEncoding(NSUTF8StringEncoding)!
var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
for byte in hash {
output.appendFormat("%02x", byte)
}
return output as String
}
Ответ 4
Ниже ссылка, которую я использовал для создания хеш-значения документа, и ее очень простое и простое вычисление хеш-значения специально для больших файлов.
Ссылка: http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and-mac-os-x/comment-page-1/#comment-18533
Ответ 5
+ (NSData *)sha256DataFromData:(NSData *)data {
unsigned char result[CC_SHA256_DIGEST_LENGTH];
CC_SHA256([data bytes], (int)[data length], result);
return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH];
}