编码
Base64
- 所有的数据都能被编码为只用65个字符就能表示的文本。 标准的Base64每行为76个字符,每行末尾添加一个回车换行符(\r\n)。不论每行是否满76个字符,都要添加一个回车换行符。
- 65字符:A~Z、a ~ z、0 ~9 + / = URL Base64算法中,为了安全,会把 + 替换成 - ,把 / 替换成 _ = 有时候用 ~ 或 . 代替
- Base64的应用 密钥 密文 图片 数据简单加密或者预处理
- 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
| 算法 | 密钥长度 | 工作模式 | 填充方式 |
|---|---|---|---|
| DES | 56/64 | ECB/CBC/PCBC/CTR/... | NoPadding/PKCS5Padding/... |
| AES | 128/192/256 | ECB/CBC/PCBC/CTR/... | NoPadding/PKCS5Padding/PKCS7Padding/... |
| IDEA | 128 | ECB | PKCS5Padding/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
双向 / 单向 算法
- 对称算法/非对称算法:双向算法,既可加密也可解密,RSA 就是一种双向非对称加密算法。
- 哈希算法:单向算法,只能加密不能解密。
哈希算法对目标信息生成一段特定长度、唯一的哈希值,却不能通过这个哈希值再重新获得目标信息。
常用的哈希算法:MD5 SHA-1 SHA-256