项目加密处理

iOS - 项目加密处理

转载: 原地址https://blog.csdn.net/xiaohe901216/article/details/51152030

因为公司是做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

/////////////

//测试代码

publicstatic void  main(String[] args)

{

    EnDeCodeTest();

}

//加解密,模拟网络

staticvoid EnDeCodeTest()

{

    try

    {

        //AES对称密钥

        String mingKey = "1A2B3C4D5E6F010203040506A7B8C9D0";

         

        //待加密明文

        String mingData = "ABCD1234中文测试";

         

        //使用AES_KEY加密数据

        String miData = CodeHelper.EncodeMessage("", mingData, mingKey);

         

        //使用PublicKey加密AES对称密钥

        InputStream inStream = newFileInputStream("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 = newFileInputStream("D:/rsa/private_rsa.pfx");

        BufferedInputStream ksbufin = newBufferedInputStream(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密钥进行数据加密。

猜你喜欢

转载自my.oschina.net/fadoudou/blog/1808057