16

所以我需要在 Objective-C 中生成一个 Sha256 密码,而且我一辈子都不知道该怎么做!我只是想念一些简单的东西吗?

我已经尝试实现以下方法(它是为 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 是未声明标识符的错误。

4

5 回答 5

23

您需要包含适当的头文件:

#include <CommonCrypto/CommonDigest.h>

根据Cryptographic Services 文档,这应该在 iOS 和 OS X 上都可用。

在 OS X v10.5 及更高版本和 iOS 5.0 及更高版本中,Common Crypto 为加密和解密提供低级 C 支持。Common Crypto 不像 Security Transforms 那样简单,但提供了更广泛的功能,包括额外的散列方案、密码模式等。

于 2013-05-31T21:26:19.590 回答
11
#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;
}

斯威夫特 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”

于 2014-09-11T00:09:53.743 回答
5

Objective-C 方法,其输出与在线随机站点的输出相匹配

-(NSString*)sha256HashForText:(NSString*)text {
    const char* utf8chars = [text UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(utf8chars, (CC_LONG)strlen(utf8chars), 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;
}

取自此要点

于 2020-03-25T19:32:18.273 回答
1

查看 NSHash 可可豆荚。它有很多不同的散列方法,包括 SHA256。

https://github.com/jerolimov/NSHash

于 2014-09-10T22:32:37.973 回答
1

Objective-C 中@zaph 答案的修改版本,使用 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];
}
于 2019-10-13T18:22:43.127 回答