【问题标题】:Generate SHA256 String in Objective C [duplicate]在Objective C中生成SHA256字符串[重复]
【发布时间】:2011-02-15 02:44:48
【问题描述】:

可能重复:
Sha256 in Objective-C for iPhone

您好,

我在 Objective C 中生成 SHA256 字符串时遇到了可怕的麻烦(可能是因为我对这门语言太陌生了)。

在 jQuery 中,我所要做的就是:

var sha256String=$.sha256("Hello");

按预期生成哈希。

但在 Objective-C 中,我尝试了以下方法无济于事:

NSString *pword=[[NSString alloc]
initWithString:login_pword.text];
unsigned char result[64];
CC_SHA256([pword UTF8String], [pword lengthOfBytesUsingEncoding:NSASCIIStringEncoding],result);
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:result delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[msg show];
[msg release];

是否有一些我可以调用的函数,例如:

NSString *sha256String=[self getSHA256:pword];

这就是我正在尝试创建的,我发现它非常困难!

希望有人能帮忙。

非常感谢,

【问题讨论】:

  • 我当然希望您不要期望 Javascript 和 Objective-C 之间有任何行为相似之处。
  • 我已经看过那个帖子了,谢谢。我正在尝试返回 sha256 字符串。
  • 链接的问题不是完全重复的。投票决定重新开放。

标签: iphone objective-c sha256


【解决方案1】:

今天玩了这么久,终于想出了一个获取SHA256的函数:

-(NSString*) sha256:(NSString *)clear{
    const char *s=[clear cStringUsingEncoding:NSASCIIStringEncoding];
    NSData *keyData=[NSData dataWithBytes:s length:strlen(s)];

    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0};
    CC_SHA256(keyData.bytes, keyData.length, digest);
    NSData *out=[NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    NSString *hash=[out description];
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
    return hash;
}

这给出了与 PHP 相同的输出。它可以轻松转换为 SHA1 - 只需将 'SHA256' 更改为 'SHA1'。

希望对某人有所帮助。

【讨论】:

  • 它帮助了某人。非常感谢! :)
  • 它也帮助了其他人 - 谢谢!
  • 我也帮助了我 - 谢谢 Eamorr!
  • 让你的代码依赖于description 对我来说似乎是一个非常糟糕的主意。描述并不意味着机器可读,而仅用于调试。
  • 什么是 CC_SHA256_DIGEST_LENGTH?知道了 - 需要#include &lt;CommonCrypto/CommonDigest.h&gt;
【解决方案2】:

您将result 传递给UIAlertViewinit 方法。 resultchar[]UIAlertView 需要 NSString*。您需要将您的char[] 转换为NSString *

试试这个:

NSString *resultString = [NSString stringWithCString:result encoding:NSASCIIStringEncoding];
UIAlertView *msg=[[UIAlertView alloc] initWithTitle:@"Hi" message:resultString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

另请参阅this 关于 iPhone 上的散列的文章。

【讨论】:

  • 嘿,我做到了,但我得到了 gobbldy-gook 的结果。它看起来像 UTF8,而实际上我希望它是 base64 编码的......
  • 好吧,您发布的代码中的任何地方都没有对结果数据进行 Base64 编码。你试过先这样做吗?再次,阅读我发布链接的文章。它用于 MD5 散列,但提到您必须对 SHA256 进行调整。
【解决方案3】:

您将需要使用 OpenSSL C 函数。例如,请参阅 this question 了解如何执行此操作。作为输入字符串,您将使用长度为[myString lengthOfBytesUsingEncoding:NSUTF8StringEncoding][myString UTFString]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2011-07-19
    • 2013-02-09
    相关资源
    最近更新 更多