SHA-256快速密钥散列

时间:2018-09-20 09:24:03

标签: ios swift sha256

我是加密和哈希算法的新手。我需要使用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 =“ 944a37b9768970c5da4f35295008470603391391223a05d2b17eed668f1678d447c”'

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

2 个答案:

答案 0 :(得分:3)

您的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实例,该实例使用连接键和消息初始化,然后在其上调用摘要函数。

答案 1 :(得分:1)

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

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

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

secret_key = "35285324354d562c245b031232115124372e5242394f51301f62224e1e432910"
message = "Guest"

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

944a37b9768970c5da4f35295008470603391223a05d2b17eed668f1678d447c

希望有帮助!

相关问题