最近有接触一个支付相关的项目,项目之前是使用的uniapp开发,纯H5页面,但是项目组涉及到安全问题就说把涉及到安全的问题移到原生,这也是我第一次接触这么多安全加密相关的东西,以前就单纯的对用户密码MD5加个密之类的,Base64加密之类的。
这里对最近的东西做一个记录,安全加密认证验签的问题还蛮常见的。
1、登录接口签名和加密:
我们项目流程如下:
1.首先生成一个16位随机码
2.随机码作为AES密码对用户ID进行加密
3.RSA的公钥对随机码进行加密,作为requestKey放在header请求接口
4.RSA的私钥将你这些参数进行签名,作为sign 传给后台接口
下面是在网上参考的资料,和我们项目的验签和加密类似,但是有点区别,自己相应的修改。
//www.greatytc.com/p/24d46369e044
RSA验签加密:
对应安卓的MD5withRSA方法,一开始以为就是先MD5再RSA加密,然而并不是,相应的处理下面链接。
https://github.com/HustBroventure/iOSRSAHandler
2、扫码功能DES解密:
我们的扫一扫支付功能处理在原生端,原生端扫码识别字符串进行DES解密传给前端处理支付即可。
DES解密代码如下:
#import "DesUtil.h"
#import <CommonCrypto/CommonCryptor.h>
NSString *const gkey = @"DES/CBC/PKCS5Padding";
const Byte iv[] = {1,2,3,4,5,6,7,8};
// 偏移量
NSString *const glv = @"12365497";
@implementation DesUtil
/// 需要初始化iv的DES解密。(CBC模式)
+ (NSString*)decodeDesCBCWithString:(NSString *)stringCBC {
// NSData*plaindata =nil;
NSString*plaintext =nil;
// NSData *cipherdata = [GTMBase64 decodeString:stringCBC];
NSData *cipherdata = [[NSData alloc] initWithBase64EncodedString:stringCBC options:NSDataBase64DecodingIgnoreUnknownCharacters];
unsigned char buffer[1024];
memset(buffer,0,sizeof(char));
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding ,
[glv UTF8String],kCCKeySizeDES,
iv,
[cipherdata bytes], [cipherdata length],
buffer,1024,
&numBytesDecrypted);
if (cryptStatus ==kCCSuccess) {
NSData*plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];
}
return plaintext;
}
#end
说复杂好像也不复杂,但是刚开始觉得还是摸不清楚~~~