在 iOS-Objective C 上签名的数据在 Java 中验证时总是返回 false

iOS 代码:


//step 1


//start of key pair genration


NSString * PrivTagString = @"com.manish.rsa.privIdentifier";


NSString * PubTagString = @"com.manish.rsa.pubIdentifier";




 privateTag = [PrivTagString dataUsingEncoding:NSUTF8StringEncoding];


 publicTag = [PubTagString dataUsingEncoding:NSUTF8StringEncoding];




NSDictionary *privateAttributes = @{(NSString *)kSecAttrIsPermanent: @YES, (NSString *)kSecAttrApplicationTag: privateTag};


NSDictionary *publicAttributes = @{(NSString *)kSecAttrIsPermanent: @YES, (NSString *)kSecAttrApplicationTag: publicTag};




NSDictionary *pairAttributes = @{(NSString *)kSecAttrKeyType: (NSString *)kSecAttrKeyTypeRSA, (NSString *)kSecAttrKeySizeInBits: @2048, (NSString *)kSecPublicKeyAttrs: publicAttributes, (NSString *)kSecPrivateKeyAttrs: privateAttributes};




OSStatus osStatus = SecKeyGeneratePair((CFDictionaryRef)pairAttributes, &publicKeyRef, &privateKeyRef);


switch (osStatus) {


    case noErr:


        break;


    default:


        break;


}


//end of key pair key genration




//step2


//export ublic key for java server




NSLog(@"%@",[self getPublicKeyAsBase64ForJavaServer]);






//step3


//Create the SHA256 digest of the custom string with CC_SHA256


NSString *stringToSign = @"Manish";




NSMutableData *hash = [NSMutableData dataWithLength:(NSUInteger)CC_SHA256_DIGEST_LENGTH];


NSData *data = [stringToSign dataUsingEncoding:NSUTF8StringEncoding];


CC_SHA256(data.bytes, (CC_LONG)data.length, hash.mutableBytes);




//step4


// Sign the hash with the private key


size_t blockSize = SecKeyGetBlockSize(privateKeyRef);




NSUInteger hashDataLength = hash.length;


const unsigned char *hashData = (const unsigned char *)hash.bytes;




NSMutableData *result = [NSMutableData dataWithLength:blockSize];






uint8_t *signedHashBytes = malloc(blockSize * sizeof(uint8_t));


memset((void *) signedHashBytes, 0x0, blockSize);


size_t encryptedDataLength = blockSize;


慕容708150
浏览 145回答 1
1回答

BIG阳

我在代码中发现了错误,因为我在钥匙串中创建密钥时保存了密钥,所以第一次如果我使用签名密钥和公钥,它会在 java 端正确验证,但下次我再次创建相同的密钥和标识符时旧钥匙仍然存在于钥匙串中,所以给我带来了麻烦。为了解决这个问题,我刚刚从钥匙串中删除了钥匙,然后再次创建它们,现在它工作正常;)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java