从NSString创建SHA1哈希

Ale*_*ijs 42 hash xcode sha1 objective-c

如何从a创建SHA1 NSString.

假设NSString设置为:

NSString *message = @"Message";
Run Code Online (Sandbox Code Playgroud)

我可以使用PHP创建一个SHA1哈希sha($message).但不幸的是,它在Objective-C中并不像那样.

hyp*_*ypt 91

我在NSString的类别中有这个(可在https://github.com/hypercrypt/NSString-Hashes获得):

#import <CommonCrypto/CommonDigest.h>

...

- (NSString *)sha1
{
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];

    CC_SHA1(data.bytes, (CC_LONG)data.length, digest);

    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

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

    return output;
}
Run Code Online (Sandbox Code Playgroud)

从Xcode 10.0开始,您应该使用import CommonCrypto它,因为它现在可以在Swift中使用!如果您最近迁移到Xcode 10.0并使用旧方法,那么这可能是您进行更改的提示:

命令CompileSwift失败,出现非零退出代码

  • Xcode 4抱怨该行:CC_SHA1(data.bytes,data.length,digest); 替换为:CC_SHA1(data.bytes,(CC_LONG)data.length,digest); (12认同)
  • 这不需要您导入<CommonCrypto/CommonDigest.h>吗? (3认同)
  • 它创建了一个可变字符串,其容量足以容纳整个输出字符串,这样就不需要在循环期间扩展字符串的存储空间.如果你知道在循环(或上限)之前你需要的大小,通常最好使用`NSCableacity``方法,因为在开始时可以分配正确的内存大小. (2认同)

Ale*_*lex 16

我非常喜欢hypercrypt的回答,但我很鼓励发表评论.

你可以看看CC_SHA1,或者这个相关的SO问题.


vir*_*ata 12

- (NSString *)sha1:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(cStr, strlen(cStr), result);
NSString *s = [NSString  stringWithFormat:
           @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
           result[0], result[1], result[2], result[3], result[4],
           result[5], result[6], result[7],
           result[8], result[9], result[10], result[11], result[12],
           result[13], result[14], result[15],
           result[16], result[17], result[18], result[19]
           ];

return s;
}
Run Code Online (Sandbox Code Playgroud)


atr*_*eat 6

我非常喜欢hypercrypt的答案,我把它打包成一个小git repo.查看Github上的NSString类别 .

也可以随意添加任何其他好的NSString Crypto