mih*_*iho 19 rsa ios commoncrypto pkcs#7
如何使用RSA密钥在iOS上签名和验证某些数据(最好使用系统自己的libcommonCrypto)?
mih*_*iho 29
由于几乎没有关于在StackOverflow和Apple文档上找到的签名和验证的任何知识,我不得不手动浏览iOS头文件并找到SecKeyRawSign和SecKeyRawVerify.以下代码行似乎有效.
签署NSData(使用带有RSA的SHA256):
NSData* PKCSSignBytesSHA256withRSA(NSData* plainData, SecKeyRef privateKey)
{
size_t signedHashBytesSize = SecKeyGetBlockSize(privateKey);
uint8_t* signedHashBytes = malloc(signedHashBytesSize);
memset(signedHashBytes, 0x0, signedHashBytesSize);
size_t hashBytesSize = CC_SHA256_DIGEST_LENGTH;
uint8_t* hashBytes = malloc(hashBytesSize);
if (!CC_SHA256([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {
return nil;
}
SecKeyRawSign(privateKey,
kSecPaddingPKCS1SHA256,
hashBytes,
hashBytesSize,
signedHashBytes,
&signedHashBytesSize);
NSData* signedHash = [NSData dataWithBytes:signedHashBytes
length:(NSUInteger)signedHashBytesSize];
if (hashBytes)
free(hashBytes);
if (signedHashBytes)
free(signedHashBytes);
return signedHash;
}
Run Code Online (Sandbox Code Playgroud)
验证(使用带RSA的SHA256):
BOOL PKCSVerifyBytesSHA256withRSA(NSData* plainData, NSData* signature, SecKeyRef publicKey)
{
size_t signedHashBytesSize = SecKeyGetBlockSize(publicKey);
const void* signedHashBytes = [signature bytes];
size_t hashBytesSize = CC_SHA256_DIGEST_LENGTH;
uint8_t* hashBytes = malloc(hashBytesSize);
if (!CC_SHA256([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {
return nil;
}
OSStatus status = SecKeyRawVerify(publicKey,
kSecPaddingPKCS1SHA256,
hashBytes,
hashBytesSize,
signedHashBytes,
signedHashBytesSize);
return status == errSecSuccess;
}
Run Code Online (Sandbox Code Playgroud)
替代方案(OpenSSL):
有一个非常好的替代品可以直接使用OpenSSL而不是libCommonCrypto.MIHCrypto是一个精心设计的OpenSSL Objective-C包装器库,它使得加密技术变得非常容易.请参阅下面的示例.
生成密钥很简单:
MIHAESKeyFactory *factory = [[MIHAESKeyFactory alloc] init];
id<MIHSymmetricKey> aesKey = [factory generateKey];
Run Code Online (Sandbox Code Playgroud)
或者从文件加载密钥:
NSData *privateKeyData = [[NSFileManager defaultManager] contentsAtPath:"mykey.pem"];
MIHRSAPrivateKey *privateKey = [[MIHRSAPrivateKey alloc] initWithData:privateKeyData];
Run Code Online (Sandbox Code Playgroud)
现在签名:
NSError *signingError = nil;
NSData *message = // load something to sign from somewhere
NSData *signature = [privateKey signWithSHA256:message error:&signingError]
Run Code Online (Sandbox Code Playgroud)
有关更多示例,请浏览MIHCrypto页面.
| 归档时间: |
|
| 查看次数: |
10637 次 |
| 最近记录: |