Как я могу вычислить хэш SHA-2 (в идеале SHA 256 или SHA 512) в iOS? - PullRequest
57 голосов
/ 03 июня 2011

API служб безопасности не позволяет мне вычислять хеш напрямую. Доступно множество общедоступных и свободно лицензированных версий, но я бы предпочел использовать реализацию системной библиотеки, если это возможно.

Данные доступны через NSData или простые указатели.

Криптографическая сила хеша важна для меня. SHA-256 является минимально допустимым размером хэша.

Ответы [ 6 ]

79 голосов
/ 03 июня 2011

Это то, что я использую для SHA1:

#import <CommonCrypto/CommonDigest.h>

+ (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.

32 голосов
/ 02 ноября 2012

Вот довольно похожий пример, основанный на 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 голосов
/ 19 марта 2016

Вот что у меня сработало

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
}
0 голосов
/ 30 марта 2018

Я немного очистил https://stackoverflow.com/a/13199111/1254812 и структурировал его как расширение NSString

@interface NSString (SHA2HEX)

/*
 Get the SHA2 (256 bit) digest as a hex string.
 */
@property (nonatomic, readonly) NSString* sha2hex;
@end

@implementation NSString (SHA2HEX)

- (NSString*)sha2hex
{
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];

    if (data.length > UINT32_MAX)
        return nil;

    uint8_t digest[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(data.bytes, (CC_LONG)data.length, digest);

    const int hexlen = CC_SHA256_DIGEST_LENGTH * 2;
    NSMutableString *hexstr = [NSMutableString stringWithCapacity:hexlen];

    for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [hexstr appendFormat:@"%02x", digest[i]];
    }

    return hexstr;
}

@end
0 голосов
/ 24 мая 2017
+ (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];
}
0 голосов
/ 12 декабря 2016

Ниже ссылки, которую я использовал для создания хеш-значения документа. Его очень просто и легко рассчитать хеш-значение специально для больших файлов.

Ссылка: http://www.joel.lopes -da-silva.com / 2010 /09/07 / вычислительно md5 или ша--хаш-из-большого файла-эффективно-на-КСН-и-макинтош-OS-X / комментарий-страничный-1 / # комментарий-18533

...