昨天尝试了rsa加密的问题

Jan 8, 2017

发表于(2016-06-16 11:59:05)

这几天的问题出现在,当时后台的底层构架他们没法改,在请求头将sign给服务器的同时,在parameter传送过程也需要将sign(数据库钥匙)以及用户账号密码等也在此中。这时出现的一个问题,在charles截取数据,sign、密码等都是明文,这是很恐怖的:服务器钥匙串、密码等都是暴露在人前。你说你去银行,这时你的账号、密码以及银行最重要的钥匙只要有点经验的人都能获取得到,谁还敢将钱放在银行。
这时前段将密码过滤多少次都没用,唯一的就是服务器和前段进行密码加密才可解决(服务器那边说没办法,只能这么处理,目前没去更改https,也没法将密码、sign值等放入header中),ok,下面是我们的处理。
可以参考这篇文章:http://www.tuicool.com/articles/bAN7BrR

#!/usr/bin/env bash echo “Generating RSA key pair …” echo “1024 RSA key: private_key.pem” openssl genrsa -out private_key.pem 1024 echo “create certification require file: rsaCertReq.csr” openssl req -new -key private_key.pem -out rsaCertReq.csr echo “create certification using x509: rsaCert.crt” openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt echo “create public_key.der For IOS” openssl x509 -outform der -in rsaCert.crt -out public_key.der echo “create private_key.p12 For IOS. Please remember your password. The password will be used in iOS.” openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt echo “create rsa_public_key.pem For Java” openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout echo “create pkcs8_private_key.pem For Java” openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt echo “finished.”

上面的为分开处理,一条一条的哟,有需要填入比如密码、公司信息、province一堆信息,记得信息记录下来哦。

Tips:

  • 在创建证书的时候, terminal会提示输入证书信息. 根据wizard输入对应信息就OK.
  • 在创建p12密匙时, 会提示输入密码, 此时的密码必须记住, 之后会用到.
  • 如果上面指令有问题,请参考最新的openssl官方文档, 以官方的为准. 之前在网上搜索指令, 被坑了一圈之后, 还是会到啃官方文档上. 每条指令文档在最后都会有几个sample,参考sample即可.

里面有个RSAEncryptor,自己去github上下载。base64在NSData里边,从iOS 7.0开始自动支持

加密

RSAEncryptor *rsa = [[RSAEncryptor alloc] init]; NSLog(@"encryptor using rsa"); NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"der"]; NSLog(@"public key: %@", publicKeyPath); [rsa loadPublicKeyFromFile:publicKeyPath]; NSString *securityText = @"hello ~"; NSString *encryptedString = [rsa rsaEncryptString:securityText]; NSLog(@"encrypted data: %@", encryptedString);

[rsa rsaEncryptString:securityText]会返回decrypted base64编码的字符串:

console out 写道
encrypted data: I1Mnu33cU7QcgaC9uo2bxV0vyfJSqAwyC3DZ+p8jm0G2EmcClarrR5R2xLDdXqvtKj+UJbES7TT+AgkK1NDoQvOJBY+jkmrpAchmRbV2jvi3cEZYQG955jrdSAu21NzQe8xWtEc3YzP+TACPdP4B3Cyy0u8N2RcSFWyxu0YKPXE=

解密:
NSLog(@"decryptor using rsa"); [rsa loadPrivateKeyFromFile:[[NSBundle mainBundle] pathForResource:@"private_key" ofType:@"p12"] password:@"123456"]; NSString *decryptedString = [rsa rsaDecryptString:encryptedString]; NSLog(@"decrypted data: %@", decryptedString);

服务器那边就让他们服务器去弄,这就是我们前段需要处理的地方

上边整理下来的文件有7个 .gem .der p12等等