在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客戶端加密和解密的簡單步驟了.希望能幫到大家.