js 加密解密

作者: 海豚先生的博客 | 来源:发表于2020-11-03 11:37 被阅读0次

    MD5 (Message-Digest Algorithm) 信息摘要算法

    • 罗纳德·李维斯特(Ron Rivest)开发出的一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value)length为32的String,用于确保信息传输完整一致。
    • 该算法于1992年发布,但是在2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
    • js中的应用
    npm install md5
    import md5 from 'md5'
    md5(message) // message: String, Buffer, Array or Uint8Array
    

    Hmac

    • Hmac算法也是一种哈希算法,它可以利用MD5或SHA1等哈希算法。不同的是,Hmac还需要一个密钥
    // node.js 的crypto模块
    const crypto = require('crypto');
    const hmac = crypto.createHmac('sha256', 'secret-key');
    hmac.update('Hello, world!');
    hmac.update('Hello, nodejs!');
    console.log(hmac.digest('hex')); // 80f7e22570...
    

    Diffie-Hellman

    // node的crypto模块
    DH算法是一种密钥交换协议,它可以让双方在不泄漏密钥的情况下协商出一个密钥来。
    示例见https://www.liaoxuefeng.com/wiki/1022910821149312/1023025778520640

    RSA算法

    • RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。
    • 是一个典型的**非对称加密**,公开密钥体制,使用不同的加密密钥与解密密钥,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的,加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
    • 安全性:RSA允许你选择公钥的大小。512位的密钥被视为不安全的;768位的密钥不用担心受到除了美国国家安全局(NSA)外的其他事物的危害;1024位的密钥几乎是安全的。
    • 通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要
    • 公钥、私钥有何特点?
      公钥加密的,私钥可以解密;
      私钥加密的,公钥可以解密。
      但公钥加密的,公钥无法解密;
      私钥加密的,私钥也无法解密!
    • js 中应用
    以下网址可以生成pem标准格式的秘钥字符串
    `http://web.chacuo.net/netrsakeypair`
    // 公钥
    let pk = `-----BEGIN PUBLIC KEY-----
              MIGfMA......Qm
              -----END PUBLIC KEY-----`
      // 私钥
    let sk = `-----BEGIN PRIVATE KEY-----
               MIICeA......gJeAgEAAoGBAP        
              -----END PRIVATE KEY-----`;
      // 原文
    let msg = "好厉害";
    // 使用jsencrypt
    npm install jsencrypt
    import JsEncrypt from 'jsencrypt'
    // 获取加密 jsencrypt 
    const encryptBody = function(data) {
      let encode = new JsEncrypt();
      // 写入公钥
      encode.setPublicKey(pk);
      // 返回加密数据
      return encode.encrypt(data);
    };
    
    //解密
    const decryptBody = function(data) {
      let decode = new JSEncrypt();
      // 写入私钥
      decode.setPrivateKey(sk)
      // 返回解密数据
      return decode.decrypt(data);
    };
    // request body msg
    encryptBody(msg)
    // response body msg
    decryptBody(msg)
    // 使用jsrsasign
    npm install jsrsasign
    import rs from 'jsrsasign'
    // 加密
    let prvKey = rs.KEYUTIL.getKey(pk);
    let enc = rs.KJUR.crypto.Cipher.encrypt(msg, prvKey);
    console.log(enc,rs.hextob64(enc));
    // 解密
    let prv = rs.KEYUTIL.getKey(sk);
    // get enc from fava
    let dec = rs.KJUR.crypto.Cipher.decrypt(enc, prv);
    console.log("jsrsasign decrypt: " + dec);
    // 签名
        var key = rs.KEYUTIL.getKey(sk);
        let signature=new rs.KJUR.crypto.Signature({alg:"SHA1withRSA"});
        signature.init(key);
        signature.updateString(msg);
        let a = signature.sign();
        let sign = rs.hextob64(a);
        console.log(sign);
    // 验签
        let signatureVf = new 
        rs.KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:pk});
        signatureVf.updateString(msg);
        // get sign from java
        let boolean = signatureVf.verify(rs.b64tohex(sign));
        console.log("jsrsasign verify: "+boolean);
    

    AES (Advanced Encryption Standard)高级加密标准

    • 2001年发布,是**对称密钥加密**体系
    • 这个标准用来替代原先的DES(Data Encryption Standard)
    • JS中的应用
    import CryptoJS from 'crypto-js'
    // 加密
    export const encrypt = (word, keyStr) => {
      keyStr = keyStr || '16进制的字符串'
      var key = CryptoJS.enc.Utf8.parse(keyStr)
      var srcs = CryptoJS.enc.Utf8.parse(word)
      var iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412');
      var encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      })
      return encrypted.toString()
    }
    // 解密
    export const decrypt = (word, keyStr) => {
      keyStr = keyStr || '16进制的字符串'
      // 如果后端给的是WordBuffer类型的数据,将Utf8换成hex
      // 如果后端进行base64编码
      // CryptoJS.enc.Base64.stringify(encryptedHexStr);
      var key = CryptoJS.enc.Utf8.parse(keyStr)
      var iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412');
      var decrypt = CryptoJS.AES.decrypt(word, key, {
        iv: iv,
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      })
      return CryptoJS.enc.Utf8.stringify(decrypt).toString()
    }
    

    DES (Data Encryption Standard)即数据加密标准

    import CryptoJS from 'crypto-js'
    //DES加密
    function encryptByDES(message, key){
        var keyHex = CryptoJS.enc.Utf8.parse(key);
        var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.ciphertext.toString();
    }
    //DES解密
    function decryptByDES(ciphertext, key){
        var keyHex = CryptoJS.enc.Utf8.parse(key);
        var decrypted = CryptoJS.DES.decrypt({
            ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
        }, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        var result_value = decrypted.toString(CryptoJS.enc.Utf8);
        return result_value;
    }
    
    

    3DES (Triple Data Encryption Algorithm)三重数据加密算法

    • 也叫Triple DES,1981年发布,是DES向AES过渡的加密算法
    • 由于计算机运算能力的增强,DES密码的密钥长度变得容易被暴力破解,3DES就是通过增加DES的密钥长度来避免类似的攻击
    • js中的应用
    import CryptoJS from 'crypto-js'
    //秘钥key
    var key = "12345677654321";
    //key不足24位自动以0(最小位数是0)补齐,如果多余24位,则截取前24位,后面多余则舍弃掉
    var base64 = CryptoJS.enc.Utf8.parse(key)
    //加密使用的是3DES中的ECB,解密对应的使用ECB
    function encrypt() {
      var text = document.getElementById("content").innerText;
      var encrypt = CryptoJS.TripleDES.encrypt(text, base64, {
        iv: CryptoJS.enc.Utf8.parse('01234567'),//iv偏移量
        // mode: CryptoJS.mode.CBC,  //CBC模式
        mode: CryptoJS.mode.ECB,  //ECB模式
        padding: CryptoJS.pad.Pkcs7//padding处理
      });
      return encrypt.toString()
    }
    //解密
    function decrypt() {
      var text = document.getElementById("encrypt").innerText;
      var decrypt = CryptoJS.TripleDES.decrypt(text, base64, {
        iv: CryptoJS.enc.Utf8.parse('01234567'),
        // mode: CryptoJS.mode.CBC,
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      });
      return decrypt.toString(CryptoJS.enc.Utf8)
    }
    

    SHA-2/3安全散列算法2/3

    SHA-1不够安全,不能继续使用,是SHA-1的后继者

    相关文章

      网友评论

        本文标题:js 加密解密

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