Swift Sha512 加密(翻译 Kotlin 代码)

Posted

技术标签:

【中文标题】Swift Sha512 加密(翻译 Kotlin 代码)【英文标题】:Swift Sha512 Encryption ( translate Kotlin code ) 【发布时间】:2022-01-19 09:43:24 【问题描述】:

这是 Kotlin 代码:

private fun verify(inputDataToVerify: String, signature: String): Boolean 
    return try 
        val pubKey = "XXXMYPUBKEYXXX"
        val bytesFromPropFile = pubKey.toByteArray()
        val keySpec = X509EncodedKeySpec(Base64.decode(bytesFromPropFile, Base64.DEFAULT))
        val keyFactory = KeyFactory.getInstance("RSA")
        val publicKey = keyFactory.generatePublic(keySpec)
        Signature.getInstance("SHA512WithRSA").run 
            initVerify(publicKey)
            update(inputDataToVerify.toByteArray())
            verify(Base64.decode(signature.toByteArray(), Base64.DEFAULT))
        
     catch (ex: Exception) 
        Timber.e(ex)
        false
    

我必须将这段代码转换为 Swift,因为我需要在我的 ios 应用程序中使用相同的行为,但我对加密真的很陌生。 我能怎么做?我需要第三方库吗?

【问题讨论】:

【参考方案1】:

您不需要加密任何东西,您需要验证签名。算法是:

SubjectPublicKeyInfospki 用于公钥(在 X509 证书标准中定义,因此得名); 旧的 RSA / PKCS#1 签名验证算法(显然使用 SHA-512 作为哈希算法)。

请注意,toByteArray() 默认使用 UTF-8 将字符串编码为二进制。显然,在 base 64 解码之前并不需要它,但是是的......

【讨论】:

【参考方案2】:

我用 SwiftyRSA 找到了一个解决方案,就是这个方法

private func verifySignature(inputDataToVerify: String, signature: String) -> Bool
    
    let pubKeyString = environmentService.getNexiPubKey()
    
    do 
        let publicKey = try PublicKey(pemEncoded: pubKeyString)
        let clear = try ClearMessage(string: inputDataToVerify, using: .utf8)
        let sign = try Signature(base64Encoded: signature)
        let isSuccessfull = try clear.verify(with: publicKey, signature: sign, digestType: .sha512)
        
        return isSuccessfull
    
    catch let error
        print(error)
        return false
    


【讨论】:

以上是关于Swift Sha512 加密(翻译 Kotlin 代码)的主要内容,如果未能解决你的问题,请参考以下文章

如何为一个密码实现sha 512,md5和salt加密[重复]

如何在Swift中将字符串哈希到SHA512?

使用 SHA512 对密码进行哈希处理以加密数据

使用 HMAC SHA512 从 API 获取数据 - Swift

用excel 宏生成SHA512加密签名

可逆加密和不可逆加密