美文网首页
H5常见的加解密方式

H5常见的加解密方式

作者: 小雨雪smile | 来源:发表于2021-03-26 16:33 被阅读0次

    本文总结项目中用到加解密方式,MD5、RSA、M2/M4、RES、AES/DES

    1.base64加解密 base64的github地址

    var str = "hello";
    var str64 = window.btoa("hello");
    console.log("字符串是:"+str);
    console.log("经base64编码后:"+str64);
    console.log("base64解码后:"+window.atob(str64))
    
    base64加解密

    2. MD5加密(不可逆) MD5加密的github地址

    关于MD5:
    MD5.js是通过前台js加密的方式对用户信息、密码等私密信息进行加密处理的工具,也可称为插件。

    MD5共有6种加密方法:
    1. hex_md5(value)
    2. b64_md5(value)
    3. str_md5(value)
    4. hex_hmac_md5(key, data)
    5. b64_hmac_md5(key, data)
    6. str_hmac_md5(key, data)
    
      //下载好了用script 标签引入使用
      <script src="md5/md5.js"></script>"></script>
      <script>
            var code = "123456";
            var username = "123456";
            var password = "123456";
            var str1 = hex_md5("123456");
            var str2 = b64_md5("123456");
            var str3 = str_md5("123456");
            var str4 = hex_hmac_md5(code,code);
            var str5 = b64_hmac_md5(username,username);
            var str6 = str_hmac_md5(password,password);
            console.log(str1);            // e10adc3949ba59abbe56e057f20f883e
            console.log(str2);            // 4QrcOUm6Wau+VuBX8g+IPg
            console.log(str3);            // áÜ9IºY«¾VàWò��>
            console.log(str4);            // 30ce71a73bdd908c3955a90e8f7429ef
            console.log(str5);            // MM5xpzvdkIw5VakOj3Qp7w
            console.log(str6);            // 0Îq§;Ý��9U©��t)ï
    </script>
    

    3.sha1加密(不可逆)sha1的github地址

    <script src="https://cdn.bootcss.com/js-sha1/0.6.0/sha1.js"></script>
    <script type="text/javascript">
            var sha1_1 = sha1("mosquito~");
            console.log(sha1_1);
            var sha1_2 = sha1("admin:1001");
            console.log(sha1_2);
    </script>
    
    sha1加密

    4.编码和解码字符串

    使用JS函数的escape()和unescape(),分别是编码和解码字符串

    <script type="text/javascript">
          var escape1 =escape("我的名字是:mosquito~");//编码
          console.log(escape1);
          var unescape1 = unescape(escape1); //解码
          console.log(unescape1);
    </script>  
    
    编码和解码字符串

    RSA

    使用rsa对大段接口参数进行加解密会大大降低接口请求及回调速度,不建议使用,推荐使用AES非对称加解密

    1.安装依赖
    npm install jsencrypt --save-dev
    2.在项目中新建RSA.js,用来存放公共加解密方法

    import JSEncrypt from 'jsencrypt';
    
    //加密
    export function encryptedData(publicKey, data) {
        // 新建JSEncrypt对象
        let encryptor = new JSEncrypt();
        // 设置公钥
        encryptor.setPublicKey(publicKey);
        // 加密数据
        return encryptor.encrypt(data);
    }
    //解密
    export function decryptedData(privateKey, data) {
        // 新建JSEncrypt对象
        let encryptor = new JSEncrypt();
        // 设置公钥
        encryptor.setPrivateKey(privateKey)
        // 加密数据
        return encryptor.decrypt(data);
    }
    
    

    3.引入与调用

    import {encryptedData, decryptedData} from '@/common/RSA.js'
    const publicKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCH6fhSFH";
    
    //加密
     let product_password = encryptedData(publicKey,"123123");
     console.log(product_password);
       
    

    AES/DES crypto-js.js

    推荐AES,AES的密钥长度比DES大,加密安全系数较高;AES对内存的需求非常低,运算速度快,性能更好

    1.安装依赖
    npm install crypto-js --save-dev
    2公共文件下创建js,引入依赖并封装加解密方法

    AES.js

    import CryptoJS from 'crypto-js';
    export default {
        //随机生成指定数量的16进制key
        generatekey(num) {
            let library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
            let key = "";
            for (var i = 0; i < num; i++) {
                let randomPoz = Math.floor(Math.random() * library.length);
                key += library.substring(randomPoz, randomPoz + 1);
            }
            return key;
        },
        //AES加密
        encrypt(word, keyStr) {
            keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345'; //判断是否存在ksy,不存在就用定义好的key
            var key = CryptoJS.enc.Utf8.parse(keyStr);
            var srcs = CryptoJS.enc.Utf8.parse(word);
            var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
            return encrypted.toString();
        },
        //AES解密
        decrypt(word, keyStr) {
            keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345';
            var key = CryptoJS.enc.Utf8.parse(keyStr);   // 解密的时候 必须使用utf8的格式
            var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
            return CryptoJS.enc.Utf8.stringify(decrypt).toString();
        }
    }
    

    DES.js

    import cryptoJs from 'crypto-js';
     
    //随机生成指定数量的16进制key
    export const generatekey = (num) => {
        let library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        let key = "";
        for (var i = 0; i < num; i++) {
            let randomPoz = Math.floor(Math.random() * library.length);
            key += library.substring(randomPoz, randomPoz + 1);
        }
        return key;
    }
    //DES加密
    export const encryptDes = (message, key) => {
        var keyHex = cryptoJs.enc.Utf8.parse(key)
        var option = { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }
        var encrypted = cryptoJs.DES.encrypt(message, keyHex, option)
        return encrypted.ciphertext.toString()
    }
    //DES解密
    export const decryptDes = (message, key) => {
        var keyHex = cryptoJs.enc.Utf8.parse(key)
        var decrypted = cryptoJs.DES.decrypt(
            {
                ciphertext: cryptoJs.enc.Hex.parse(message)
            },
            keyHex,
            {
                mode: cryptoJs.mode.ECB,
                padding: cryptoJs.pad.Pkcs7
            }
        )
        return decrypted.toString(cryptoJs.enc.Utf8)
    }
    

    3.引入与调用
    AES

    import AES from "@/common/AES.js";
    var keys = AES.generatekey(16);  ////秘钥必须为:8/16/32位
    //如果是对象/数组的话,需要先JSON.stringify转换成字符串
    var encrypts = AES.encrypt(JSON.stringify(cars),keys);
    var dess = JSON.parse(AES.decrypt(encrypts,keys));
    // var encrypts = that.$encrypt('1234asdasd',keys);
    // var dess = that.$decrypt(encrypts,keys);
    console.log(encrypts)
    console.log(encrypts.length)
    console.log(dess)
    

    DES

    import { encryptDes, decryptDes,generatekey } from '@/common/DES.js'
     var keys = generatekey(16);
    //如果是对象/数组的话,需要先JSON.stringify转换成字符串
    var encrypts = encryptDes(JSON.stringify(cars),keys);
    var dess = JSON.parse(decryptDes(encrypts,keys));
    // var encrypts = that.$encrypt('1234asdasd',keys);
    // var dess = that.$decrypt(encrypts,keys);
    console.log(encrypts)
    console.log(encrypts.length)
    console.log(dess)
    

    国密sm2,sm3,sm4加解密

    国密算法是国家密码局制定标准的一系列算法,主要有SM1,SM2,SM3,SM4,密钥长度和分组长度均为128位。其中

    • SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
    • SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
    • SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
    • SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
      sm-crypto可以在微信小程序中实现SM2、SM3、SM4国密算法
    国密2

    国密需2要用到的依赖
    npm install --save sm-crypto

    //引入
    const sm2 = require('sm-crypto').sm2;
    const cipherMode = 1; // 1 - C1C3C2,0 - C1C2C3,默认为1
    //切记如果选用的了C1C2C3的加密方式时是在加密后的密文前面需要加04的
    let msgString="wonders"; //要加密的字符串
    let publicKey="04813d4d97ad31bd9d18d785f337f683233099d5abed09cb397152d50ac28cc0ba43711960e811d90453db5f5a9518d660858a8d0c57e359a8bf83427760ebcbba" ///公钥,16进制格式,由后端生成
     //加解密
    let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode); // 生成密文,每次生成都会不同
    let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode); // 解密结果
    

    国密4
    国密需4要用到的依赖
    npm install --save gm-crypt

    const SM4 = require("gm-crypt").sm4;
    let sm4Config = {
        //配置sm4参数
        key: "HENG1AN2WEN3YIN4", //这里这个key值是跟后端要的 16/128位
        mode: "ecb", // 加密的方式有两种,ecb和cbc两种,也是看后端如何定义的,不过要是cbc的话下面还要加一个iv的参数,ecb不用
        cipherType: "base64", //
     };
     let sm4 = new SM4(sm4Config); //这里new一个函数,将上面的sm4Config作为参数传递进去。然后就可以开心的加密了
     let newPassword ="wonders"; //要加密的字符
     let Password = sm4.encrypt(newPassword); //密码加密     
    }
    

    ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
    CBC:是一种循环模式(链式),前一个分组的密文和当前分组的明文操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准

    相关文章

      网友评论

          本文标题:H5常见的加解密方式

          本文链接:https://www.haomeiwen.com/subject/zvvhqltx.html