【发布时间】:2021-12-01 05:14:06
【问题描述】:
我有一个字节数组,想用 Swift 代码中的非对称私钥对其进行签名。我在下面有 java 代码,想在 iOS swift 中做同样的事情。
try {
final java.security.Signature instance = provider == null ?
java.security.Signature.getInstance(algorithm.getJvmName()) :
java.security.Signature.getInstance(algorithm.getJvmName(), provider);
if (signature.getParameterSpec() != null) {
instance.setParameter(signature.getParameterSpec());
}
instance.initSign(key);
instance.update(signingStringBytes);
return instance.sign();
} catch (final NoSuchAlgorithmException e) {
throw new UnsupportedAlgorithmException(algorithm.getJvmName());
} catch (final Exception e) {
throw new IllegalStateException(e);
}
在 Swift 中尝试了以下代码
public func sign(value: String, base64EncodingOptions:Data.Base64EncodingOptions = []) -> String? {
do {
let keyData = Data(base64Encoded: privateKey)!
let key = SecKeyCreateWithData(keyData as CFData,
[kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecAttrKeyClass: kSecAttrKeyClassPrivate,] as NSDictionary, nil)!
var data = value.data(using: .utf8)!
var error: Unmanaged<CFError>?
guard let signedData = SecKeyCreateSignature(key, .rsaSignatureDigestPSSSHA256, data as CFData, &error) as Data?
else {
return nil
}
let signData = signedData as Data
let signedString = signData.base64EncodedString(options: [])
return signedString
}
catch {
//handle error
}
return ""
}
【问题讨论】:
-
好的。您查看过 iOS SDK 的哪些部分并尝试过哪些内容?在 Developer.apple.com 上快速搜索会发现一个名为“Apple CryptoKit”的 SDK。也许这会给你一个开始寻找的好地方。
-
更新了我的问题
-
那段代码哪里出错了?当你运行它时会发生什么。我至少注意到
SecKeyCreateWithData的文档指出kSecAttrKeySizeInBits属性是必需的。 -
@ScottThompson CryptoKit 不支持 RSA,如果这是他们使用的密钥。对于 Sandeep:一个好主意是在创建密钥时捕获变量中的错误,看看是否可以使用它。不幸的是,安全框架仍然有点老,所以它没有do/try/catch
标签: ios swift encryption cryptography