话题: 对称加密 非对称加密 端到端加密

如何在没有SSL的情况对数据传输进行加密使其不能被明文传输?

如题,如何在没有实现全站HTTPS的情况,对类似登录啊,修改敏感信息等进行数据的传输加密,以至于让嗅探器不能明文捕捉呢? 展开

写回答
  • 邀请回答
  • 举报
  • 亚飞正传 背弃了理想,谁人都可以,那会怕有一天只你共我!
    2018.09.05

    这种情况可以考虑使用对称加密和非对称加密进行敏感信息的传输。

    这里我们先讨论下非对称加密中的RSA算法,假定看这个回答的都是了解RSA非对称加密信息的童鞋哈。

    拿登录时候的账户密码中的密码举例,密码信息在前端(如登陆页中)可以使用JSEncrypt这类js加密工具使用服务端生成的公钥进行加密生成密文

    然后通过表单或者ajax等方式传输到服务端之后,服务端使用私钥密文进行解密还原原始密码。

    这样的话,信息在整个http传输过程中都是密文进行传输,即使信息被截获,对方拿到前端的公钥,也无法进行逆向解密还原密文。

    code实例,以python为例:

    前端js加密:

    <script>
    //前置逻辑忽略
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey($('#rsaPublicKey').val());//从隐藏域取出公钥
    var encryptedPasswd = encrypt.encrypt($('#password').val());//生成加密后的密文
    $('#password').val(encryptedPasswd);
    </script>


    后端python解密:

    # 一定要引入Crypto,可以pip安装
    from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
    import base64

    # 业务逻辑忽略
    # 解密还原密文 get_rsa_private_key()为自定义方法,取出私钥
    rsa_key = RSA.importKey(get_rsa_private_key()) # 导入读取到的私钥
    cipher = Cipher_pkcs1_v1_5.new(rsa_key) # 生成对象
    password = cipher.decrypt(base64.b64decode(password), "ERROR") # 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成str