【问题标题】:Swift equivalent of MessageDigest in Java? [duplicate]Swift 相当于 Java 中的 MessageDigest? [复制]
【发布时间】:2023-04-01 14:55:01
【问题描述】:

我正在尝试在我的应用程序中进行身份验证加密,它适用于 kotlin,但不适用于 swift。我们正在尝试使用“AES/ECB/PKCS5Padding”。在 kotlin 代码下方获取密钥。但我的 swift 代码返回的结果与 kotlin 不同。

private fun getSecretKey(): SecretKey {
        val messageDigest = MessageDigest.getInstance("SHA-1")
        val key = messageDigest.digest(SECRET_KEY.toByteArray(Charset.forName("UTF-8")))
            .copyOfRange(0, 16)
        return SecretKeySpec(key, "AES")

    }

如何在 Swift 中实现这一点? swift中MessageDigest.getInstance的等价物是什么。

【问题讨论】:

  • “我的 Swift 代码返回不同的结果”——我在你的问题中看不到 Swift 代码。
  • 请注意,这段 Kotlin 代码显示了糟糕的加密实践。对密码进行正常的加密散列不会产生安全密钥。为此,您需要一个基于密码的密钥派生函数或 PBKDF。 Java 在 Oracle 的默认 JRE 中有 PBKDF2。所以你应该完全替换上面的代码而不是复制它。
  • @MartinR 他在上一个问题中这样做了,当他没有得到快速回答时,他只是转发了部分问题:(

标签: java ios swift encryption cryptoswift


【解决方案1】:

不存在 SecretKeySpec 的等价物。但是这个 Java 类主要包装了一个二进制密钥。下面的代码只返回二进制键数据。

对于 Swift 4:

    let secretKey = "secret"
    let data = Data(secretKey.utf8)
    var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH))
    data.withUnsafeBytes { 
        _ = CC_SHA1($0, CC_LONG(data.count), &digest)
    }
    return data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2015-04-21
    • 2013-03-07
    • 2016-03-06
    • 2020-04-13
    • 1970-01-01
    相关资源
    最近更新 更多