【问题标题】:SHA-256 Hashing with secret key swiftSHA-256 散列与密钥 swift
【发布时间】:2019-02-24 13:32:29
【问题描述】:

我是加密和散列算法的新手。我需要使用 SHA-256 算法对带有密钥的字符串进行哈希处理。 我从堆栈溢出和其他一些教程中尝试了多个链接,使用这些链接,我在 iOS 中收到的输出与我在 Android 中获得的输出不同。我在两个平台上都使用了相同的字符串和密钥。

Android 代码片段 -

MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(secret_key);
byte[] channelKeyLong = digest.digest(message.getBytes("utf-8"));

输入 -

secret_key = "35285324354d562c245b031232115124372e5242394f51301f62224e1e432910"
message = "Guest"

OUTPUT = "99D71664BD5A35E0185C020BACB709DEB24A81555E275CA9328F8CB4E6F186C3"

iOS 代码片段 -

extension String {
  func generateSHA256(key: String) -> String {
        var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
        CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), key, key.count, self, self.count, &digest)
        let data = Data(bytes: digest)
        return data.map { String(format: "%02hhx", $0) }.joined()
    }
}

输入 -

secret_key = "35285324354d562c245b031232115124372e5242394f51301f62224e1e432910"
message = "Guest"

实施 -> 输出 = message.generateSHA256(secret_key)

`OUTPUT = "944a37b9768970c5da4f35295008470603391223a05d2b17eed668f1678d447c"'

请建议我可以在 iOS 中实现的任何其他方法,以产生与在 android 中接收到的相同的输出。

【问题讨论】:

  • 尝试使用这个库:github.com/krzyzanowskim/CryptoSwift
  • 我也浏览过 CryptoSwift 库,但找不到任何方法来复制 android 的输出。如果您能提供任何代码片段,将会很有帮助。
  • 我认为 HMAC 不同于散列函数。您是否尝试过使用CC_SHA256_Init()CC_SHA256_Update()CC_SHA256_Final()
  • 嗨垫子,你能提供一些可以产生相同输出的示例代码吗?这将非常有帮助。谢谢
  • 我也尝试了 CC_SHA256 函数 'CC_SHA256_Init()、CC_SHA256_Update() 和 CC_SHA256_Final()' 但没有成功。

标签: ios swift sha256


【解决方案1】:

您的 Android 代码和您的 iOS 代码不相同。

您的 Android 代码只需计算与您的消息连接的键值连接的 SHA256 摘要。

您首先使用您的密钥调用update,然后使用您的消息调用digest。文档指出:

使用指定的字节数组对摘要执行最终更新,然后完成摘要计算。即该方法先调用update(input),将输入数组传递给update方法,然后调用digest()

另一方面,您的 iOS 代码正在使用提供的密钥计算您的消息的 HMAC。这不是一回事。

您需要像在 Android 上一样计算 SHA256;

  • 使用CC_SHA256_Init
  • 使用您的密钥和消息致电CC_SHA256_Update
  • 致电CC_SHA256_Final 获取哈希

在 Swift 中使用SwiftyRSA 可能更容易。然后,您需要做的就是创建一个ClearMessage 的实例,并使用您的连接键和消息进行初始化,然后在其上调用摘要函数。

【讨论】:

  • 您好 Paulw11,您能否提供一些相同的代码 sn-p。这真的会有很大帮助。提前致谢。
【解决方案2】:

不知道 android 如何执行 SHA-256,但对于 iOS,我可以说,您正在执行的代码是完美的,结果是正确的。您应该将您的问题更新为:“如何获得与 iOS 相同的 Android SHA-256”

您可以在线查看SHA-256 HashMap here

只需输入输入和密钥,然后从列表中选择 SHA-256。

secret_key = "35285324354d562c245b031232115124372e5242394f51301f62224e1e432910"
message = "Guest"

您将看到输出,这与您从问题中的 iOS 代码中获得的输出相同。

944a37b9768970c5da4f35295008470603391223a05d2b17eed668f1678d447c

希望对你有帮助!

【讨论】:

  • 但是我亲爱的朋友,android 结果在 iOT 设备上运行良好。我需要匹配我的输出以使 iOS 应用程序与设备一起工作:(
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 2018-07-14
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多