crypto-js 加密库学习笔记

Posted 胖鹅68

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了crypto-js 加密库学习笔记相关的知识,希望对你有一定的参考价值。

文章参考

  1. https://www.liaoxuefeng.com/wiki/1022910821149312/1023025778520640
  2. https://www.npmjs.com/package/crypto-js
  3. https://github.com/brix/crypto-js
  4. https://cryptojs.gitbook.io/docs/
  5. https://www.jianshu.com/p/7b5eb33512fd

一、现状

  1. 加密算法全世界都知道
  2. 在不安全的网络下传输

二、解决问题

在加密算法公开并且不安全的网络环境下的安全性

三、crypto是什么?

crypto 模块提供了加密功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装

四、快速入门

  1. 安装
npm install crypto-js
  1. 引入
import CryptoJS  from 'crypto-js';
console.log(CryptoJS.SHA256("huangbiao68").toString());
import sha256 from 'crypto-js/sha256';
console.log(sha256("huangbiao68").toString());

五、加密方式介绍

Base64加密

对于Base64编码的,我觉得看一篇文章能够解决你的疑惑,我在这里就不赘述了。

一篇文章彻底弄懂Base64编码原理

单向散列(hash)加密

  1. 定义:指把任意长的输入串编码变化成固定长的输出串,并且由输出串难以得到输入串的加密方式。

  2. 使用场景:对敏感数据加密; 如:用户密码,请求参数,文件加密

  3. 常见的单向散列加密算法:MD5、SHA、MAC、CRC

  4. 优点

    方便存储:加密后都是固定大小(32位)的字符串,能够分配固定大小的空间存储;

    损耗低:加密/加密对于性能的损耗微乎其微;

    文件加密:只需要32位字符串就能对一个巨大的文件验证其完整性;

    不可逆:大多数的情况下不可逆,具有良好的安全性。

  5. 缺点

    1. 存在暴力破解的可能性,最好通过加盐值的方式提高安全性
    2. 可能存在散列冲突

对称加密

  1. 定义:同一个密钥可以同时用作数据的加密和解密,这种方法称为对称加密。

  2. 用场景:相对于大一点的数据量或关键数据的加密;如:接口参数签名验证服务

  3. 常见的对称加密算法有:

    • DES、高级加密标准(AES,Advanced Encryption Standard)
    • AES是DES的升级版,密钥长度更长,选择更多,也更灵活,安全性更高,速度更快。
  4. 优点: 算法公开、计算量小、加密速度快、加密效率高

  5. 缺点

    1. 发送方和接收方必须商定好密钥,然后使双方都能保存好密钥,密钥管理成为双方的负担。
    2. 对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

非对称加密

  1. 定义:需要两个密钥来进行加密和解密,这两个密钥分别是公钥(public key)和私钥(private key)。

  2. 使用场景:对安全性要求很高的场景,适合加密少量数据;如:支付数据、CA数字证书

  3. 常见的对称加密算法有:RSA、RSA2

  4. 优点:
    与对称加密相比,安全性更好,加解密需要不同的密钥,公钥和私钥都可以进行相互的加解密。

  5. 缺点:

    1. 加密和解密花费时间长,速度慢只适合对少量数据进行加密。
    2. 非对称加密算法的RSA2比RSA有更强的安全能力。蚂蚁金服,新浪微博 都在使用 RSA2 算法。

谈撒盐(salt)加密

参考谈撒盐(salt)加密

加密(注册时)

在这里插入图片描述

  1. 用户注册,系统随机产生salt值。
  2. 将salt值和密码连接起来,生产Hash值。
  3. 将Hash值和salt值分别存储在数据库中。

解密(登陆时)

在这里插入图片描述

  1. 系统根据用户名找到与之对应的密码Hash。
  2. 将用户输入密码和salt值进行散列。
  3. 判断生成的Hash值是否和数据库中Hash相同。

Hmac

Hmac类是用于创建加密Hmac摘要的工具。
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

六、案例

散列

import CryptoJS from "crypto-js";
console.log(CryptoJS.SHA256("123456").toString());
console.log("加密结果一 MD5:" + CryptoJS.MD5("你好"));

散列 + salt

import CryptoJS from "crypto-js";
console.log("加密结果一 MD5:" + CryptoJS.HmacMD5("你好", "salt"));
console.log(CryptoJS.HmacSHA256("123456", "salt").toString());

PBKDF2

var salt = CryptoJS.enc.Utf8.parse("salt"); //盐
var iter = 1000; //迭代次数
var mi = CryptoJS.PBKDF2("你好", salt, {
  keySize: parseInt(4),
  iterations: parseInt(iter),
});

console.log("加密结果三:" + mi);

AES

前端 crypto-js aes 加解密,参考vue AES加密(超详细)

  1. 加密解密的方法封装
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;
    },
    
    //加密
    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();
    },
    //解密
    decrypt(word, keyStr) {
        keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345';
        var key = CryptoJS.enc.Utf8.parse(keyStr);
        var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
        return CryptoJS.enc.Utf8.stringify(decrypt).toString();
    }
 
}
  1. 测试
// var keys = AES.generatekey(16);
 
//如果是对象/数组的话,需要先JSON.stringify转换成字符串
// 不传key值,就默认使用上述定义好的key值
 
var encrypts = AES.encrypt(JSON.stringify(cars));
var dess = JSON.parse(AES.decrypt(encrypts));
 
// var encrypts = AES.encrypt('1234asdasd');
// var dess = AES.decrypt(encrypts);
 
console.log(encrypts)
console.log(encrypts.length)
console.log(dess)

RSA

JavaScript的RSA加密库(cryptico、Node-rsa、Crypto、jsrsasign、JSEncrypt)

思维导图和附件

crypto-js加密库.xmind 下载
在这里插入图片描述

以上是关于crypto-js 加密库学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

前端 使用 crypto-js 对数据进行对称加密

DES 加密解密方法

DES 加密解密方法

crypto-js 与 php-mcrypt AES 加密/解密

三分钟撸完前后端crypto-js加解密,你学废了吗?

三分钟撸完前后端crypto-js加解密,你学废了吗?