实习技术总结(七)前端加密解密库 CryptoJS

807 阅读3分钟

编码

Base64

  1. 所有的数据都能被编码为只用65个字符就能表示的文本。 标准的Base64每行为76个字符,每行末尾添加一个回车换行符(\r\n)。不论每行是否满76个字符,都要添加一个回车换行符。
  2. 65字符:A~Z、a ~ z、0 ~9 + / = URL Base64算法中,为了安全,会把 + 替换成 - ,把 / 替换成 _ = 有时候用 ~ 或 . 代替
  3. Base64的应用 密钥 密文 图片 数据简单加密或者预处理
  4. Base64编码解码与btoa、atob

Hex

二进制数据最常用的一种表示方式。用0-9 a-f 16个字符表示。每个十六进制字符代表4bit。也就是2个十六进制字符代表一个字节。在实际应用中,尤其在密钥初始化的时候,一定要分清楚自己传进去的密钥是哪种方式编码的,采用对应方式解析,才能得到正确的结果。

加密算法

加密和解密的过程是可逆的。

对称加密算法

加密/解密使用相同的密钥

  • DES 数据加密标准
  • 3DES TripleDES DESede
  • AES 高级加密标准,根据密钥长度不同又分为AES-128 AES-192 AES-256,其中AES-192 AES-256在Java中使用需获取无政策限制权限文件

CryptoJS提供ECB,CBC,CFB,OFB,CTR五种模式,填充方式提供NoPadding ZeroPadding Pkcs7(Pkcs5) Iso10126 Iso97971 AnsiX923

算法密钥长度工作模式填充方式
DES56/64ECB/CBC/PCBC/CTR/...NoPadding/PKCS5Padding/...
AES128/192/256ECB/CBC/PCBC/CTR/...NoPadding/PKCS5Padding/PKCS7Padding/...
IDEA128ECBPKCS5Padding/PKCS7Padding/...

非对称加密算法

  • 使用公钥加密,使用私钥解密
  • 公钥是公开的,私钥保密
  • 加密处理安全,但是性能极差,单次加密长度有限制 
    • pkcs1padding  输入的明文最大字节数为密钥字节数-11,输出的密文与密钥等长。
    • NoPadding 输入的明文最大字节数为密钥字节数  输出的密文与密钥等长。
  • RSA既可用于数据交换,也可用于数据校验 数据校验通常结合消息摘要算法 MD5withRSA 等
  • 两种加密算法常见结合套路 随机生成密钥 密钥用于AES/DES/3DES加密数据 RSA对密钥加密 提交加密后的密钥和加密后的数据给服务器。

JavaScript实现

parse和stringify

var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
var wordArray = CryptoJS.enc.Hex.parse(hexString);
var wordArray = CryptoJS.enc.Base64.parse(base64String);
var wordArray = CryptoJS.enc.Latin1.parse(latin1String);

var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
var hexString = CryptoJS.enc.Hex.stringify(wordArray);
var base64String = CryptoJS.enc.Base64.stringify(wordArray);
var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);

CryptoJS.format.OpenSSL.parse
CryptoJS.format.OpenSSL.stringify

Base64与Hex

var srcs = CryptoJS.enc.Utf8.parse("15968079470");
CryptoJS.enc.Base64.stringify(srcs);
// CryptoJS.enc.Hex.stringify(srcs);

消息摘要算法

var hash = CryptoJS.MD5(message);
var hash = CryptoJS.MD5(wordArray);
var hmac = CryptoJS.HmacMD5(message, key);

var hash = CryptoJS.SHA1(message);
var hash = CryptoJS.SHA1(wordArray);
var hmac = CryptoJS.HmacSHA1(message, key);

var hash = CryptoJS.SHA224(message);
var hash = CryptoJS.SHA224(wordArray);
var hmac = CryptoJS.HmacSHA224(message, key);

var hash = CryptoJS.SHA256(message);
var hash = CryptoJS.SHA256(wordArray);
var hmac = CryptoJS.HmacSHA256(message, key);

var hash = CryptoJS.SHA3(message);
var hash = CryptoJS.SHA3(wordArray);
var hmac = CryptoJS.HmacSHA3(message, key);

var hash = CryptoJS.SHA384(message);
var hash = CryptoJS.SHA384(wordArray);
var hmac = CryptoJS.HmacSHA384(message, key);

var hash = CryptoJS.SHA512(message);
var hash = CryptoJS.SHA512(wordArray);
var hmac = CryptoJS.HmacSHA512(message, key);

对称加密算法

var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);

var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);

var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);

var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);

var cfg={
    iv: iv,
    mode:CryptoJS.mode.CBC,
    padding:CryptoJS.pad.Pkcs7,
    format:CryptoJS.format.Hex
};


var srcs = CryptoJS.enc.Hex.parse("2783726e20d0d334520cbbbb9cd95d9b");
//CryptoJS.enc.Base64.stringify(srcs);
var decryptdata = CryptoJS.AES.decrypt(
    CryptoJS.lib.CipherParams.create({ ciphertext: srcs}),
    key,
    cfg
);
decryptdata.toString(CryptoJS.enc.Utf8);

wordArray转换到字符串

var string = wordArray + '';
var string = wordArray.toString();
var string = wordArray.ciphertext.toString();  //对称加密算法里有

var string = wordArray.toString(CryptoJS.enc.Utf8);
var string = wordArray.toString(CryptoJS.format.Hex);
var string = wordArray.toString(CryptoJS.format.Base64);

如果一份文件为电子版本,如何确保签名者身份不可伪造?这就使用到了数字签名算法。

数字签名算法

  • RSA
    • RSA 加密算法 + 哈希算法
  • DSA
  • ECDSA

image.png

双向 / 单向 算法

  • 对称算法/非对称算法:双向算法,既可加密也可解密,RSA 就是一种双向非对称加密算法。 image.png
  • 哈希算法:单向算法,只能加密不能解密。 哈希算法对目标信息生成一段特定长度、唯一的哈希值,却不能通过这个哈希值再重新获得目标信息。 image.png 常用的哈希算法:MD5 SHA-1 SHA-256