Ios 如何在Swift或Objective C中使用PKCS8 RSA DER私钥
我发现了类似的问题,但对我来说不起作用Ios 如何在Swift或Objective C中使用PKCS8 RSA DER私钥,ios,objective-c,swift,Ios,Objective C,Swift,我发现了类似的问题,但对我来说不起作用 不容易。苹果公司希望您使用证书(公钥)或身份(.p12文件,公钥/私钥对),这使得存储原始密钥变得困难。这尤其适用于私钥——如果可以避免的话,您通常不希望内存空间中有未加密的私钥。在OSX上,SecItemImport()可以工作,但在iOS上不行,尽管我现在还没有检查几个OS版本 如果确实需要,可以强制执行它,但它必须是PKCS#1 DER数据——因此必须从PKCS#8数据中提取PKCS#1密钥,这意味着必须手动解析DER 这是公钥PKCS#8数据的较旧
不容易。苹果公司希望您使用证书(公钥)或身份(.p12文件,公钥/私钥对),这使得存储原始密钥变得困难。这尤其适用于私钥——如果可以避免的话,您通常不希望内存空间中有未加密的私钥。在OSX上,
SecItemImport()
可以工作,但在iOS上不行,尽管我现在还没有检查几个OS版本
如果确实需要,可以强制执行它,但它必须是PKCS#1 DER数据——因此必须从PKCS#8数据中提取PKCS#1密钥,这意味着必须手动解析DER
这是公钥PKCS#8数据的较旧示例:
使用该代码,您可以获得公钥的SecKeyRef;私钥的结构稍有不同,但想法相似
不过,最好的办法是获取一个.p12文件并使用
SecPKCS12Import()
。这将获得SecIdentityRef,从那里可以使用SecIdentityCopyPrivateKey()获取私钥SecKeyRef。不容易。苹果公司希望您使用证书(公钥)或身份(.p12文件,公钥/私钥对),这使得存储原始密钥变得困难。这尤其适用于私钥——如果可以避免的话,您通常不希望内存空间中有未加密的私钥。在OSX上,SecItemImport()
可以工作,但在iOS上不行,尽管我现在还没有检查几个OS版本
如果确实需要,可以强制执行它,但它必须是PKCS#1 DER数据——因此必须从PKCS#8数据中提取PKCS#1密钥,这意味着必须手动解析DER
这是公钥PKCS#8数据的较旧示例:
使用该代码,您可以获得公钥的SecKeyRef;私钥的结构稍有不同,但想法相似
不过,最好的办法是获取一个.p12文件并使用SecPKCS12Import()
。这将获得SecIdentityRef,然后可以使用SecIdentityCopyPrivateKey()获取私钥SecKeyRef。查看。它演示了如何使用secitemport
加载密钥进行签名和验证
您还应该仔细查看SecExternalFormat
enum,其中包含kSecFormatWrappedPKCS8
。这可能就是你要找的东西。看看。它演示了如何使用secitemport
加载密钥进行签名和验证
您还应该仔细查看
SecExternalFormat
enum,其中包含kSecFormatWrappedPKCS8
。这可能就是您要查找的内容。请添加一些您尝试的内容的代码请添加一些您尝试的内容的代码谢谢您的回答,任何时候SecKeyGetBlockSize引发异常错误访问
,我都无法理解原因。NSString*路径=[[NSBundle mainBundle]路径用于资源:@“私钥”类型:@“pem”];NSData*content=[[NSData alloc]initWithContentsOfFile:path];SecKeyRef privateKey=(桥SecKeyRef)(内容);如果(privateKey){signedHashBytesSize=SecKeyGetBlockSize(privateKey);}
我发现这个解决方案链接在下面,但是#include
没有发现,你无法从NSData
桥接SecKeyRef
。您需要使用secitemport
。您看过上面的存储库了吗?它包含一个示例代码。感谢您的回答,任何时候SecKeyGetBlockSize出现异常访问错误,我都无法理解原因。NSString*path=[[NSBundle mainBundle]pathForResource:@“private_key”,类型:@“pem”];NSData*content=[[NSData alloc]initWithContentsOfFile:path];SecKeyRef privateKey=(桥SecKeyRef)(内容);如果(privateKey){signedHashBytesSize=SecKeyGetBlockSize(privateKey);}
我发现这个解决方案链接在下面,但是#include
没有发现,你无法从NSData
桥接SecKeyRef
。您需要使用secitemport
。您看过上面的存储库了吗?它包含一个示例代码。