将Node.js私钥签名代码迁移至Swift的算法适配问题
问题:将Node.js RSA签名代码移植到Swift并匹配签名结果
我正尝试将一段通过私钥生成签名的Node.js代码移植到Swift环境中。私钥通过以下OpenSSL命令生成:
openssl genrsa -des3 -out WM_IO_my_rsa_key_pair 2048
可正常运行的Node.js代码
const crypto = require('crypto'); const fs = require("fs"); (async () => { const privateKey = await fs.promises.readFile("./keys/in.pem"); const string = "Hello World" const sign = crypto.createSign('sha256'); sign.write(string); sign.end(); const signature = sign.sign({ key: privateKey }); const signature_enc = signature.toString("base64"); console.log(signature_enc); })()
Swift尝试代码及疑问
为适配Swift,我通过以下OpenSSL命令从.pem文件导出私钥:
openssl rsa -in in.pem -out out.pem
我的Swift代码如下,但无法确定应使用哪种签名算法来生成与Node.js一致的签名:
import UIKit import Security import CommonCrypto func createKey(pem: String) -> SecKey? { let attributes: [NSObject : NSObject] = [ kSecAttrKeyType: kSecAttrKeyTypeRSA, kSecAttrKeyClass: kSecAttrKeyClassPrivate, kSecAttrKeySizeInBits: NSNumber(value: 2048) ] let privateKey = pem .replacingOccurrences(of: "-----BEGIN RSA PRIVATE KEY-----", with: "") .replacingOccurrences(of: "-----END RSA PRIVATE KEY-----", with: "") .split(separator: "\n").joined() guard let privateKeyData = Data(base64Encoded: privateKey, options: .ignoreUnknownCharacters) else { return nil } var error: Unmanaged<CFError>? return SecKeyCreateWithData(privateKeyData as CFData, attributes as CFDictionary, &error) } func createHash(string: String) -> Data { let hash = UnsafeMutablePointer<UInt8>.allocate(capacity: Int(CC_SHA256_DIGEST_LENGTH)) let hashLength = string.count defer { hash.deallocate() } CC_SHA256(string, CC_LONG(hashLength), hash) return Data(bytes: hash, count: hashLength) } let privateKey = """ -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAqckjzlwALItYzb8Q6zX4pxTlGZS5N/D/ARdrpCVlOzjgF6Je kxvHxa5/DvlFVuI4z02Yy0/Rut/OTYnq75sKKUuQrR0tqdKbS5tRMYoGQLkvy02i JMN8roK+G/ua6BMC/ZxVtEH3eKP3bN5Sj7XcLTtK36k37megqnED9LEyXJMu55N5 iMs+o2TmRNkCy/6Bf6FCrIuVrebiabpbmfoLdPOxbZtaBikfJWbeW7nGw+1mZ5pX JDclIezve95qqg2es08K4DbsSAZra2nzXrbIGb+v1nueiFnpymslltcQPYnD4ZlY bcz1NxrvB1vxTKL8kWQDBQ9WM3/i3okhgucfQIDAQABAoIBABjqzfhxBA2Ffcjk K4V5bD6JEH5Kl0wgcCwm1cNHQa4JUMnnKF4Ki6z1SOxXpNd1Z8T0rGHaGvuD8PDs NrBnXnxk/JyLVbJAmE3mQ2ozyWsiQmNhx1QB5IBv65qLuFYqxBuYH/POYpUv6xXt Isy4cdGpi/l7ChxQ1QFuiJgWkT+IlPNn5GbS5YeAy4usP6Dbt3j2ZDHk5eGgJCR/ IEctjM7MpdAzYufph9HbtdgVUnGufIgFxIbnyMHk7w6m95cdAkeftPnW5PzHiL6J JQwpDwJSvSDl6/ZtFGI1lzWEwAy4vD5kH/JO6X++Jmv9mxbk/C2pCAOs9xxMCzu4 ipuFVTkCgYEA2FRuwCViS9wwzAqc93LD/nynHK+9kN1SgmebqtIwv1qeI3zYqf2+ +kbd8W/J6s4CA57bvgelc8+hzweXeI/OddJTWa0cyEI9Lp8Tse6SRyBh4Rr9nSdN CKlWuWjS/GgjYcV4YEd7yKI8qKPEfZ3OFgELuCA/sTgrKrbzQZuk9Y8CgYEAyOuz m6o6rdSA1lef+3Sbp3VhLXxgXR2AXYrlcaMqjigHmrGll7lMSYKc8v7pCALiOVrc 0fJz/1EvDCFJEY+3lw4txNrYKZFMGSE/UrRHVzPFM56cl30F/aDJpRwvDGUcCyZJ XXGxjI7H17FXADG3vhwZl7Pos7ManonLBDz3vzMCgYEA1NjuRzwBJSa3FGt02bsf wGsheYYofDpnDkumzEIXGI+ufLg/7bHukA3eHcmh39dl/+3zw1t+nR4z1KFhlYvY 1fBldhxv71HNJOv70twrLLRd2cBWvKOIlfcXj0HmJdbIyVAkCocK8fM+v6ayk+4K cXgB8d45DMN5JYPwgCMGAV0CgYBSHDk/kZb/eUvZzN+dpO8Dxa2cKCs9gpP2JpBU G4mFpQhOiPESi3CIzi8UA2b6lisbo22BA2OyYNwoSeYRnjk6K1o7C/CxNCb0UikN xI0vLwIVcWmvYzGykCY4KsdzelK2n8P1w0P7HFLBbEEQ3ECqGdO/so+T+MsVJVzp c30QDwKBgQC64tKOj4Y0UT8CsxN4DgpVCdSkxIQOeRjj7OWQz8Q3JGIoEgvkfJyy 8XrnhYhZCA62q/ObYjvSeD9I+7aLwSL7uvkFkLKN1N0Qtg3m97lmoChzrfZvgwfC 3SrC6WP2j1F8zyilyeAVlSGBMZuNfBVMwezwqXNAnY4OgOwmtnD9FA== -----END RSA PRIVATE KEY----- """ if let key = createKey(pem: privateKey) { // Create hash let hash = createHash(string: "Hello World") var error: Unmanaged<CFError>? if let signature = SecKeyCreateSignature(key, .rsaSignatureMessagePKCS1v15SHA256, hash as CFData, &error) as Data? { let signiture64 = signature.base64EncodedString() } }
需要帮助确定正确的签名算法,使Swift代码生成与Node.js一致的签名。
内容的提问来源于stack exchange,提问作者Berry Blue
相关产品推荐
相关产品推荐

