最近在搞項(xiàng)目中的加解密相關(guān),選了幾種方案捏膨,最終定下來(lái)用RSA+AES進(jìn)行加解密秧均,在此記錄一下,如果有問(wèn)題号涯,大家可以一起探討下~
我們項(xiàng)目中的加密流程是:
1.客戶端生成AES隨機(jī)128位秘鑰(base64字符串)目胡,得到key為aeskey
2.服務(wù)端生成兩對(duì)RSA公私鑰,clientPrivate,clientPublick,servePrivate,servePublick
3.客戶端使用clientPrivate對(duì)明文數(shù)據(jù)生成數(shù)字簽名sign
4.將第3步生成的sign作為入?yún)⒘纯欤尤氲秸?qǐng)求參數(shù)中誉己,然后將整體入?yún)⑥D(zhuǎn)換為json串
5.客戶端使用aeskey對(duì)json數(shù)據(jù)進(jìn)行加密得到密文(encryptData)
6.客戶端使用服務(wù)端的servePublick公鑰對(duì)aeskey進(jìn)行加密,得到密文(encryptKey)
7.分別將encryptData和encryptKey作為參數(shù)傳輸給服務(wù)器端
以上為客戶端向服務(wù)端傳輸加密數(shù)據(jù)的過(guò)程域蜗。
客戶端進(jìn)行解密操作的話巨双,流程反過(guò)來(lái)即可噪猾。
報(bào)文封裝
- 1.請(qǐng)求端用己方的私鑰對(duì)原始請(qǐng)求報(bào)文進(jìn)行簽名
- 2.組裝JSON報(bào)文格式如下:
{
"content":原始請(qǐng)求報(bào)文,
"sign":簽名字符串
}
- 3.請(qǐng)求端生成AES秘鑰筑累,并以該秘鑰對(duì)第2步生成的JSON字符串進(jìn)行加密(結(jié)果為Base64字符串)
- 4.請(qǐng)求端用對(duì)方公鑰對(duì)AES密鑰字符串(hexString格式)進(jìn)行RSA加密(結(jié)果為Base64字符串)
- 5.請(qǐng)求端組裝JSON報(bào)文畏妖,格式如下:
{
"package1": 第3步的加密結(jié)果,
"package2": 第4步的加密結(jié)果
}
解密和驗(yàn)簽過(guò)程:
- 1.響應(yīng)端接到請(qǐng)求報(bào)文,用己方RSA私鑰對(duì)報(bào)文中的package2字段進(jìn)行RSA解密疼阔,得到AES秘鑰字符串
- 2.用1得到的AES秘鑰字符串,對(duì)請(qǐng)求報(bào)文中的package1字段進(jìn)行解密
- 3.對(duì)2解密得到的JSON報(bào)文進(jìn)行解析半夷,content字段為原始報(bào)文婆廊,sign字段為簽名。使用RSA公鑰對(duì)content和sign進(jìn)行驗(yàn)簽巫橄。
秘鑰規(guī)格:
字符串編碼 UTF-8
RSA key長(zhǎng)度2048
RSA 加解密時(shí)的算法: RSA/ECB/PKCS1Padding
RSA 簽名時(shí)的算法: SHA256withRSA
AES key長(zhǎng)度128位
AES 加解密時(shí)的算法: AES/CBC/PKCS5Padding
其中生成128位隨機(jī)秘鑰代碼:
- (NSString *)random128BitAESKey {
unsigned char buf[16];
arc4random_buf(buf, sizeof(buf));
NSData *data = [NSData dataWithBytes:buf length:sizeof(buf)];
NSData *base64Data = [data base64EncodedDataWithOptions:0];
NSString * stringBase64 = [[NSString alloc] initWithData:base64Data encoding:0];
return stringBase64;
}