iOS - 项目加密处理

因为公司是做P2P的,所以数据安全还是有些必要的,说下思路:
密码一般就是MD5加盐,后来改为苹果自己的钥匙串keychain加密
一些客户隐瞒信息加密处理还是很有必要,既保护客户隐私安全又保护了公司客户资源。
我们项目基本处理就是AES+RSA
当用户登录时除了用户名和密码还会需要一个key(key就是一个登录的验证), 这个key是由登录号(手机号)加5位随机数生成,手机号基本就是为了保证key的唯一性,此key用做AES密钥,这个密钥是每次执行登录操作随机生成的
然后RSA加密不用于加密数据,而是用来加密AES的密钥,RSA的公钥有服务器端提供
程序每次启动执行登录都会生成一个key,并且每次请求都会进行一次key的验证,同时也确保了账号的登录唯一(换机登录问题),如果请求内容有需要加密的直接AES加密即可
这种方案每次启动程序都要执行登录操作
下边是一个看到的类似处理方案:
一个移动客户端与服务端安全交互的解决方案。

针对: http://my.oschina.net/kaster/blog/130940


客户端使用AES加密报文,使用RSA公钥加密AES密钥
服务端使用私钥解密AES密钥,再使用AES密钥解密密文

隐掉了数据压缩部分
标签: <无>

代码片段(2)[全屏查看所有代码]

1. [文件] rsa.rar ~ 6KB     下载(298)     

2. [代码][Java]代码     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/
//测试代码
 
public static void main(String[] args)
{
     EnDeCodeTest();
}
 
//加解密,模拟网络
static void EnDeCodeTest()
{
     try
     {
         //AES对称密钥
         String mingKey = "1A2B3C4D5E6F010203040506A7B8C9D0" ;
         
         //待加密明文
         String mingData = "ABCD1234中文测试" ;
         
         //使用AES_KEY加密数据
         String miData = CodeHelper.EncodeMessage( "" , mingData, mingKey);
         
         //使用PublicKey加密AES对称密钥
         InputStream inStream = new FileInputStream( "D:/rsa/public_rsa.cer" );
         CertificateFactory cf = CertificateFactory.getInstance( "X.509" );
         X509Certificate cert = (X509Certificate) cf.generateCertificate(inStream);
         PublicKey pubKey = cert.getPublicKey();
         
         //加密后的AES对称密钥
         String miKey = CodeHelper.EncodeKey( "" , mingKey, pubKey);
         
         //通过网络交互数据 miData miKey
         String miKey_ = miKey;
         String miData_ = miData;
         
         //使用PrivateKey解密AES对称密钥
         // 密钥仓库
         KeyStore ks = KeyStore.getInstance( "PKCS12" );
 
         // 读取密钥仓库
         FileInputStream ksfis = new FileInputStream( "D:/rsa/private_rsa.pfx" );
         BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
 
         char [] keyPwd = "password" .toCharArray();
         ks.load(ksbufin, keyPwd);
         // 从密钥仓库得到私钥
         PrivateKey priK = (PrivateKey) ks.getKey( "test" , keyPwd);
         
         //明文AES密钥
         String mingKey_ = CodeHelper.DecodeKey( "" , miKey_, priK);
         
         //解密数据
         String mingData_ = CodeHelper.DecodeMessage( "" , miData_, mingKey_);
         
         System.out.print( "Result:" + mingData_ + "\r\n" );
     }
     catch (Exception e)
     {
         System.out.print(e);
     }
}

问:RSA 很少用来做加密算法使用,一般多数用于数据签名算法中。这是由于 RSA 作为加密算法进行加密处理时,其所能处理的原文数据量不能超过 (RSA 长度 / 8 - 11),比如:RSA 1024 进行加密运算时,原文的长度不能超过 117 个字节。 

你这个安全数据传输可以改进一下,可以参照 SSL/TLS 协议握手的原理,AES 密钥不是固定的,由通信双方各随机生成一半,双方生成的一半密钥通过对方的 RSA 公钥加密传送给对方,对方使用自己的 RSA 私钥解密,这样与自己的另外一半 AES 密钥拼合成数据传输的加密密钥,从而完成密钥的交换过程。

答:这一块是用于移动客户端,架构上只要保证客户端的数据不被窃取即可。 客户端的AES密钥是随机生成,RSA加密不用于加密数据,而是用来加密AES的密钥。 因为客户端不是支付类的客户端,所以没有对每台终端生成独立的私钥证书。 ----- 另外,之前客户端与服务端的交互是短连接,每次交互都随机生成AES密钥,数据用AES加密,AES密钥用RSA加密,每次请求同时传递密文和加密后的AES密钥; 现在的方案是,客户端启动后,先进行一次检查公钥证书的交互,再进行一次激活交互,激活交互用于客户端传递AES密钥(128位,使用RSA公钥加密),服务端返回激活流水,后续的交互,客户端使用激活时设定的AES密钥进行数据加密。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值