在IOS的app登陆模块,用户名和密码如果直接传给后台服务器,很容易被截获并伪造网络请求,
如果利用RSA算法在每个客户端利用公钥解密,服务器端进行私钥解密,即使截获了密码也是无法解密的.
在Mac 上自带了openssl 可以生成公钥私钥.
通过下面的几步可以生成对应的需要的证书和公钥 私钥
先打开终端 cd 到一个容易找到的文件夹
1 生成私钥
openssl genrsa -out private.pem 1024
// openssl:是一个自由的软件组织,专注做加密和解密的框架。
// genrsa:指定了生成了算法使用RSA
// -out:后面的参数表示生成的key的输入文件
// 1024:表示的是生成key的长度,单位字节(bits)
2 创建证书请求
openssl req -new -key private.pem -out rsacert.csr
3 生成证书并签名,有效期10年
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
//509是一种非常通用的证书格式。
//将用上面生成的密钥privkey.pem和rsacert.csr证书请求文件生成一个数字证书rsacert.crt。这个就是公钥
4 转换格式 将 PEM 格式文件 转换成 DER 格式
openssl x509 -outform der -in rsacert.crt -out rsacert.der
//在 iOS开发中,公钥是不能使用base64编码的,上面的命令是将公钥的base64编码字符串转换成二进制数据
//导出 P12 文件
5 在iOS使用私钥不能直接使用,需要导出一个p12文件。下面命令就是将私钥文件导出为p12文件。
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
执行完上述操作 会得到
上面的命令会生成5个文件,IOS用到的是rsacert.der和p.p12导入到项目中不要直接拖拽进去,而是点击Xcode右下角的+号,选择add files to ""
新建项目后添加库:Security.framework在项目中添加所依赖的文件RSAEncryptor和NSData+Base64
在这里下载
在控制器类里面执行代码
- (void)touchesBegan:(NSSet<UITouch > )touches withEvent:(UIEvent )event
{
RSAEncryptor rsaEncryptor = [[RSAEncryptor alloc] init];
NSString publicKeyPath = [[NSBundle mainBundle] pathForResource:@"rsacert" ofType:@"der"];
NSString privateKeyPath = [[NSBundle mainBundle] pathForResource:@"p" ofType:@"p12"];
[rsaEncryptor loadPublicKeyFromFile: publicKeyPath];
[rsaEncryptor loadPrivateKeyFromFile: privateKeyPath password:@""]; // 密码这个是创建证书的时候输入的 如果没输入这里不填写
NSString* restrinBASE64STRING = [rsaEncryptor rsaEncryptString:@"你好,新的世界之窗"];
NSLog(@"加密后的: %@", restrinBASE64STRING); //加密
NSString* decryptString = [rsaEncryptor rsaDecryptString: restrinBASE64STRING];//解密
NSLog(@"解密后的: %@", decryptString);
}
运行结果:
2017-07-19 17:03:46.425005+0800 RSA加密[445:57891] 加密后的: Vn/frFlIEM4DRA88SYRMRtBGeVqCpDlZCUYXmx1L2/gSSc0ye0GvlQCaGB8+UQj8JXNg9DYcQafRT3SgD/PChSfFZtQIoVJTXHbzedPonSUYkaftdIpslrLIB/XuV9XF6QnY2tfIpbmc9NGQbRgqihmQDKWNFOd3pERwutpUj2A=
2017-07-19 17:03:46.433864+0800 RSA加密[445:57891] 解密后的: 你好,新的世界之窗
总结:这就是iOS客户端加密和解密的简单步骤了.希望能帮到大家.