JS 常见加密

文章目录

JS 常见的加密方式

加密在前端开发和爬虫中是经常遇见的,掌握了加密算法且可以将加密的密文进行解密破解,是你从一个编程小白到大神级别质的飞跃。且加密算法的熟练和剖析也是有助于帮助我们实现高效的 JS 逆向

常见的加密算法基本分为这几类:

  • 线性散列算法(签名算法)MD5
  • 对称性加密算法 AES DES
  • 非对称性加密算法 RSA

一、 MD5 加密

  • MD5 是一种被广泛使用的线性散列算法,可以产生出一个 128 位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且 MD5 加密之后产生的是一个固定长度(32 位或 64 位)的数据

  • 解密

    • 常规讲 MD5 是不存在解密的。但是理论上 MD5 是可以进行反向暴力破解的。暴力破解的大致原理就是用很多不同的数据进行加密后跟已有的加密数据进行对比,由此来寻找规律。理论上只要数据量足够庞大 MD5 是可以被破解的。但是要啊注意,破解 MD5 是需要考虑破解的成本(时间和机器性能),假设破解当前的 MD5 密码需要目前计算能力最优秀的计算机工作 100 年才能完成破解。那么,当前的 MD5 密码就是安全的
    • 增加破解成本的方法(方法很多,这里是常用的)
      • 使用一段无意义且随机的私钥进行 MD5 加密会生成一个加密串,我们暂且称之为串 1
      • 将要加密的数据跟串 1,拼接,在进行一次 MD5 ,这时会生成串 2
      • 将串 2 在次进行 MD5 加密,这时生成串 3 就是我们加密后的数据
    • 我们在注册账号时的密码一般都是用的 MD5 加密

二、 DES / AES 加密

https://www.cnblogs.com/liuzhongkun/p/16189433.html

  • DES 为数据加密标准,是一种使用密钥加密的算法。该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密钥(一组字符串)即可

  • 注意:

    • 现在使用 AES 这个标准来代替原先的 DES
    • AES 和 DES 的区别:
      • 加密后密文长度的不同
        • DES 加密后密文长度是 8 的整数倍
        • AES 加密后密文长度是 16 的整数倍
      • 应用场景不同:
        • 企业级开发使用 DES 足够安全
        • 如果要求高使用 AES
    • 使用 DES / AES 进行数据交互时要求双方都拥有相同的私钥
    • 破解方法:
      • 暴力破解
      • DES 如果使用 56 位的密钥,则可能的密钥数量是 2^56 个。只要足够强大是可以被破解的
  • DES 算法入口参数有三个:

    • Key:为 7 个字节共 56 位,是 DES 算法的工作密钥

    • Data:为 8 个字节 64 位,是要被加密或别解密的数据

    • Mode:为 DES 的工作方式

    • padding:为填充模式,如果加密后密文长度如果达不到整数倍(8个字节、16个字节),填充对应的字符

      • padding 的赋值固定为 CryptoJS.pad.Pkcs7 即可
      <html>
          <script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/aes.js"></script>    <script>
              var aseKey = "12345678";  // 定制密钥,长度必须为
              var message = "i am kun, who are you";  
              // 加密
              var encrypt = CryptoJS.DES.encrypt(message, CryptoKey.enc.Utf8.parse(aseKey), {
                  mode: CryptoJS.mode.ECB,
                  padding: CryptoJS.pad.Pkcs7
              }).toString();
              alert(encrypt);
              // 解密
              var decrypt = CryptoJS.DES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), {
                  mode: CryptoJS.mode.ECB,
                  padding: CryptoJS.pad.Pkcs7
              }).toString();  
              alert(decrypt)
          </script>
      </html>
      

三、 RSA 加密

https://www.cnblogs.com/liuzhongkun/p/16189411.html

  • RSA 加密:

    • RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。
  • 非对称加密算法:

    • 非对称加密算法需要两个密钥:
      • 公开密钥(公钥)
      • 私有密钥(私钥)
      • 公钥和私钥是一对的,如果用公钥对数据进行加密,只有对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫做非对称加密算法
  • 注意:

    • 使用时,都是使用公钥加密使用私钥解密。公钥可以公开,私钥自己保留
    • 算法强度复杂、安全性依赖于算法和密钥但是由于其算法复杂,而使用加密解密速度没有对称加密解密的速度快
  • 使用流程和场景介绍:

    • 通过公钥加密,使用私钥解密。私钥是通过公钥计算生成的。假设 ABC 三方之间互相要进行加密通信,大家互相之间使用公钥进行信息加密,信息读取时使用各自对应的私钥进行信息加密
    • 用户输入支付密码会通过 RSA 加密
  • 公钥私钥生成方式:

    • 公钥私钥可以在线生成

      <html>
          <script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.2.1/jsencrypt.min.js"></script>   
          <script>
              // 公钥
              var publicKey = "-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOu+ebw0Me7Id17/Edcc4x3U5TTx5LHDKq2KVWHPUMC3o+bIoq6xJATWB8pdwds8KH8obetTDD19m+gXxc7hcGcCAwEAAQ==-----END PUBLIC KEY-----"
              // 私钥
              var privateKey = "-----BEGIN PRIVATE KEY-----MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6755vDQx7sh3Xv8R1xzjHdTlNPHkscMqrYpVYc9QwLej5siirrEkBNYHyl3B2zwofyht61MMPX2b6BfFzuFwZwIDAQABAkEA5Bi5ivtpsOOwdG8SIPQnYG7kk3TVVZZEDgPCF1BTjxKFCTxrdjrXvQiOD8IyVEa7toUlex4iqT6nvpJwX8CKKQIhAPjgt9q5XK5KL3ml3/kDkfiaFIK96JCFbYQtxtaONSYzAiEA8n2KDOPeNSzt3PVpvV3vrsYEOerAgPpV5B60CvuqkP0CIQDtfiuUKix6GUrij9qCGtkR3Z7TAHxMZTcT2kcTeVLYpwIhAKt4uJEq5SvHDKCt7crZzS5SmhR2ew/5dZktWPVXRyLlAiB0zvSbxHivCRYis8dMnPIcAb2f2wjfaRmiMauCYUxQbA==-----END PRIVATE KEY-----"
              // 使用公钥加密
              var encrypt = new JSEncrypt();  // 实例化度对象
              encrypt.setPublicKey(publicKey);  // 设置公钥
              var encrypted = encrypt.encrypt("hello world");  // 加密内容
              alert(encrypted);
              // 私钥解密
              var decrytp = new JSEncrypt();  // 实例化对象
              decrytp.setPrivateKey(privateKey);  // 设置私钥
              var uncrypted = decrytp.decrypt(encrypted)  // 解密
              alert(uncrypted);
          </script>
      </html>
      

四、 base 64 伪加密

  • Base64 是一种使用 64 位字符来表示任意二进制数据的方法。base64 是一种编码方式而不是加密算法,只是看上去像是加密而已

  • Base64 使用 A-Z,a-z, 0-9,+,/ 这64个字符实现对数据进行加密

    <html>
        <script>
        // 还有 Base64 关键字
            var string = "hello";
            var encrypt = btoa(string) // 编码
            alert(encrypt)
            var decrypt = atob(encrypt) // 解码
            alert(decrypt)
     </script>
    </html>
    

五、 https 对称密钥加密

  • https 是基于 http 和 SSL / TLS 实现的一个协议,它可以保证在网络上传输的数据都是加密的,从而保证数据安全
  • 接下来我们从 http 协议开始,提出宪法并逐步进行分析,最终实现 https
  1. http 协议是不安全的
    • 在 https 诞生之前,所有网站都是用 http 协议,而 http 协议在数据传输过程中都是明文,所以可能存在数据泄露和篡改
  2. 使用对称密钥进行数据加密
    • 为了防止数据泄露和篡改,我们对数据进行加密,如:生成一个对称密钥,将对称密钥分别交给浏览器和服务器端,他们之间传输的数据都是使用密钥进行加密和解释
    • 请求和响应如下:
      • 客户端使用对称密钥对请求进行加密,并发送给服务器
      • 服务端接收到密文之后,使用对称密钥对密文进行解密,然后处理请求,最后使用对称密钥将要返回的内容再次加密,返回给客户端
      • 客户端接收到密文之后,使用对称密钥进行解密,并获取最终的响应内容
    • 如此一来,数据传输都是密文,解决了明文传输数据的问题。但是,有 bug
      • 浏览器如何获取对称密钥
      • 每个客户端的对称密钥相同,浏览器能拿到对称密钥,那么黑客也可以拿到,所以,数据加密也就毫无意义了
  3. 动态对称密钥和非对称密钥
    • 为了解决对称密钥的动态性以及让客户端和服务端安全的获取密钥,可以引入非对称密钥机制
    • 如此一来,解决了动态对称密钥和数据加密问题,因为每个用户的对称密钥都是随机生成且传输的过程中都使用公钥加密(公钥加密的数据只有私钥能解密),所有黑客无法接货对称密钥。而数据传输是通过对称密钥加密过的,所以黑客即使能获取数据也无法去解密看到真实的内容,看似无懈可击,但是,还是有 bug
      • 公钥是明文传输的
  4. CA 证书的应用
    • 使用 ca 证书可以解决问题

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注