数据加密传输

默认我们的数据传输都是不经过加密的,要加密传输的话得用上HTTPS协议。easyopen在1.4.0版本开始提供了数据加密传输,不需要HTTPS协议。

easyopen基于公私钥+AES加密传输,交互流程如下:

  1. 0. 事先把公钥放在客户端,私钥放在服务端
  2. 1. 客户端生成一个随机码randomKey
  3. 2. randomKey通过公钥RSA加密str = rsa_encode(randomKey,publicKey)
  4. 3. str发送到服务端
  5. 4. 服务端通过私钥解开str,得到randomKey:randomKey = rsa_decode(str, privateKey)
  6. 5. 服务端使用randomKey通过AES对称加密一个值(假设值为"0")返回给客户端,resp = aes_encode("0", randomKey)
  7. 6. 客户端用自己的randomKeyaes解密resp,如果得到的是"0",则整个握手交互完成,后续都用这个randomKey进行aes加解密传输
  8. 注:
  9. 黑客是可以拿到公钥的,但是黑客无法知道客户端生成的随机码randomKey,一旦str发生改变则握手失败.
  10. 整个过程的重点就是将randomKey安全的送到服务器,后期都用randomKey进行对称加密传输,对称加密黑客无法破解.
  11. 此流程参照HTTPS,只不过服务器无法将公钥正确的送到客户端(浏览器),因此浏览器的HTTPS需要CA机构介入.

公私钥配置

  • 生成公私钥

    1. public class PubPriKeyTest extends TestCase {
    2. /**
    3. * 生成公私钥
    4. * @throws Exception
    5. */
    6. @Test
    7. public void testCreate() throws Exception {
    8. KeyStore store = RSAUtil.createKeys();
    9. System.out.println("公钥:");
    10. System.out.println(store.getPublicKey());
    11. System.out.println("私钥:");
    12. System.out.println(store.getPrivateKey());
    13. }
    14. }
  • 在客户端新建一个pub.key文件,放入公钥字符串,pub.key放在客户端,启动的时候加载。

  • 在服务端新建一个pri.key文件,放入私钥字符串,pri.key放在resources目录下,服务启动会自动读取。
    easyopen-sdk的resources下已经存放了一个pub.key,实例化一个EncryptClient对象就能使用数据加密传输。感兴趣的同学可以查看源码,了解整个交互流程。
    1. // 数据加密传输不需要secret
    2. OpenClient client = new EncryptClient(url, app_key);