Сгенерируйте хэш SHA256 в Objective-C

Итак, мне нужно сгенерировать пароль Sha256 в Objective-C, и я не могу понять, как это сделать! Есть что-то легкое, я просто отсутствую?

Я пробовал реализовать следующий метод (который был написан для iPhone, но я подумал, может быть, он будет работать кросс-платформенным, как это делает код Objective-C)

-(NSString*)sha256HashFor:(NSString*)input
{
    const char* str = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, strlen(str), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

Но это просто выплюнул ошибки о том, что CC_SHA256_DIGEST_LENGTH является необъявленным идентификатором.

Ответ 1

Вам нужно включить соответствующий заголовочный файл:

#include <CommonCrypto/CommonDigest.h>

Согласно документации Cryptographic Services, это должно быть доступно как для iOS, так и для OS X.

В OS X версии 10.5 и более поздних версиях и iOS 5.0 и более поздних версиях Common Crypto обеспечивает низкоуровневую поддержку C для шифрования и дешифрования. Common Crypto не так прост, как Security Transforms, но предоставляет более широкий спектр функций, включая дополнительные схемы хэширования, режимы шифрования и т.д.

Ответ 2

#import <CommonCrypto/CommonDigest.h>

Objective-C: SHA256 - это всего две строки:

+ (NSData *)doSha256:(NSData *)dataIn {
    NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(dataIn.bytes, dataIn.length, macOut.mutableBytes);
    return macOut;
}

Swift 3

func sha256Hex(string: String) -> String? {
    guard let messageData = string.data(using:String.Encoding.utf8) else { return nil }
    var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))

    _ = digestData.withUnsafeMutableBytes {digestBytes in
        messageData.withUnsafeBytes {messageBytes in
            CC_SHA256(messageBytes, CC_LONG(messageData.count), digestBytes)
        }
    }

    return digestData.map { String(format: "%02hhx", $0) }.joined()
}

//Тест

let sha256HexString = sha256Hex(string:"Hello")
print("sha256HexString: \(sha256HexString!)")

sha256HexString: "185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969"

Ответ 3

Проверьте модуль NSHash cocoa. Он имеет множество различных методов хэширования, включая SHA256.

https://github.com/jerolimov/NSHash

Ответ 4

измененная версия ответа @zaph в Objective-C с NSString в качестве входных и выходных данных:

-(NSString*)sha256HashFor:(NSString*)input
{
    NSData* data = [input dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableData *sha256Data = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
    CC_SHA256([data bytes], (CC_LONG)[data length], [sha256Data mutableBytes]);
    return [sha256Data base64EncodedStringWithOptions:0];
}