【问题标题】:Generate SHA256 hash in Objective-C在 Objective-C 中生成 SHA256 哈希
【发布时间】:2020-03-26 03:32:18
【问题描述】:

所以我需要在 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 是未声明标识符的错误。

【问题讨论】:

    标签: objective-c macos passwords sha256 password-hash


    【解决方案1】:

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

    #include <CommonCrypto/CommonDigest.h>
    

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

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

    【讨论】:

    • 我建议使用#import 而不是#include,因为它可以确保标题只包含一次。 #import 防止递归包含。
    • @doodle 虽然它是一个 C 头文件 - 它已经内置了检查功能。
    • 虽然这确实有效,但由于某种原因,它没有产生与我的 PHP 脚本相同的 sha256。
    • 我是 sha256 加密密码连同最后附加的 Zo4rU5Z1YyKJAASY0PT6EUg7BBYdlEhPaNLuxAwU8lqu1ElzHv0Ri7EM6irpx5w,来自 php 和 Objective-c 端的值是不同的。
    • 没关系,我把它修好了。我只是在我的代码中有一个错误。感谢詹姆斯的帮助!
    【解决方案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;
    }
    

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

    【讨论】:

    • 我正在尝试将其转换为 nsstring 以便将其保存到数据库中,但它无法正常工作。您能否告诉我将 SHA256 密钥存储到数据库: NSString* newStr = [[NSString alloc] initWithData:sha256 encoding:NSUTF8StringEncoding];
    • 不可能将任意数据转换为字符串,并非所有 8 位字节都映射到字符编码。有两种常见的选项:十六进制或 Base64 表示。也可以选择将原始数据放入数据库。
    • 现在,我正在这样做..这是正确的吗? NSString * str = [sha256Data base64EncodedStringWithOptions:0];
    【解决方案3】:

    输出与random site online的输出匹配的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;
    }
    

    取自this Gist

    【讨论】:

      【解决方案4】:

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

      https://github.com/jerolimov/NSHash

      【讨论】:

        【解决方案5】:

        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];
        }
        

        【讨论】:

          猜你喜欢
          • 2012-01-17
          • 1970-01-01
          • 2016-10-10
          • 1970-01-01
          • 2016-07-09
          • 2021-03-18
          • 2016-08-20
          • 1970-01-01
          • 2017-06-16
          相关资源
          最近更新 更多