JavaScript加密解密7种方法总结分析
JavaScript加密解密是前端工程师必须掌握的技能之一,本文总结了7种常见的JavaScript加密解密方法,并且提供了详细的代码示例。
1. Base64编码与解码
Base64是一种将二进制数据编码为文本的编码规则,其不仅可以用于前端加密解密,也可以用于图片、音频等二进制数据的传输。具体的编码和解码方法如下:
编码:
function base64Encode(str){
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
ac = 0,
enc = "",
tmp_arr = [];
if (!str) {
return str;
}
str = unescape(encodeURIComponent(str))
do {
// pack three octets into four hexets
o1 = str.charCodeAt(i++);
o2 = str.charCodeAt(i++);
o3 = str.charCodeAt(i++);
bits = o1 << 16 | o2 << 8 | o3;
h1 = bits >> 18 & 0x3f;
h2 = bits >> 12 & 0x3f;
h3 = bits >> 6 & 0x3f;
h4 = bits & 0x3f;
// use hexets to index into b64, and append result to encoded string
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
} while (i < str.length);
enc = tmp_arr.join('');
var r = str.length % 3;
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
}
解码:
function base64Decode(str){
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
ac = 0,
dec = "",
tmp_arr = [];
if (!str) {
return str;
}
str = str.replace(/[^A-Za-z0-9+/=]/g, "");
do {
// unpack four hexets into three octets using index points in b64
h1 = b64.indexOf(str.charAt(i++));
h2 = b64.indexOf(str.charAt(i++));
h3 = b64.indexOf(str.charAt(i++));
h4 = b64.indexOf(str.charAt(i++));
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
o1 = bits >> 16 & 0xff;
o2 = bits >> 8 & 0xff;
o3 = bits & 0xff;
if (h3 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1);
} else if (h4 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1, o2);
} else {
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
}
} while (i < str.length);
dec = tmp_arr.join('');
return decodeURIComponent(escape(dec.replace(/\0+$/, '')));
}
举一个Base64编码和解码的例子:
var str = "Hello, world!";
var encoded = base64Encode(str); // "SGVsbG8sIHdvcmxkIQ=="
var decoded = base64Decode(encoded); // "Hello, world!"
2. 对称加密算法
对称加密算法指的是加密和解密使用相同密钥的加密算法,简单、高效,常见的对称加密算法有DES、3DES、AES等。
此处以AES加密算法为例,加密解密使用的是同一根秘钥,加密和解密方法如下:
var key = CryptoJS.enc.Utf8.parse("1234567812345678"); //16位秘钥
var iv = CryptoJS.enc.Utf8.parse('1234567812345678'); //16位向量
var encrypted = CryptoJS.AES.encrypt("Hello, world!", key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
});
var decryptedStr = decrypted.toString(CryptoJS.enc.Utf8); // "Hello, world!"
3. 非对称加密算法
非对称加密算法指的是加密和解密使用不同密钥的加密算法,常用的非对称加密算法有RSA、DSA等。
下面是RSA加密算法的加密解密方法:
// 生成密钥对
var keySize = 512;
var keyPair = cryptico.generateRSAKey("test", keySize);
// 获取公钥和私钥
var publicKey = cryptico.publicKeyString(keyPair);
var privateKey = cryptico.privateKeyString(keyPair);
// 使用公钥加密
var message = "Hello, world!";
var encrypted = cryptico.encrypt(message, publicKey);
// 使用私钥解密
var decrypted = cryptico.decrypt(encrypted.cipher, keyPair);
var decryptedPlainText = decrypted.plaintext; // "Hello, world!"
4. MD5哈希
MD5是一种常用的哈希算法,用于产生哈希值,其特点是不可逆、不可撤销、不可复原,使用md5.js库实现MD5加密解密:
var md5 = require("md5.js");
var str = "Hello, world!";
var hash = new md5().update(str).digest("hex"); //"86fb269d190d2c85f6e0468ceca42a20"
5. SHA1哈希
SHA1也是一种常用的哈希算法,同样不可逆、不可撤销、不可复原,SHA1.js库提供了SHA1加密解密的实现方法:
var SHA1 = require("sha.js");
var str = "Hello, world!";
var sha1 = new SHA1("SHA-1", "TEXT");
sha1.update(str);
var hash = sha1.digest("hex"); //"943a702d06f34599aee1f8da8ef9f7296031d699"
6. HMAC哈希
HMAC是一种用于消息鉴别的机制,基于哈希函数和密钥,在消息传输过程中防止消息被篡改。HMAC.js库提供了HMAC算法的实现:
var hmacSha256 = require("crypto-js/hmac-sha256");
var message = "Hello, world!";
var secret = "1234567812345678";
var hmac = hmacSha256(message, secret);
var hash = hmac.toString(); // "54d9d6fd12cb8a46b8f2aaeb7d2358f0b456f39b07fe92706a08d409c5aa9db3"
7. PBKDF2哈希
PBKDF2是一种基于密码的密钥推导函数,可以从密码导出密钥,形成合适长度的密钥,从而降低攻击成本。PBKDF2.js库提供了PBKDF2加密解密的实现方法:
var pbkdf2 = require("pbkdf2");
var password = "123456";
var salt = "salt"; //盐值
var keyLen = 256 / 32; //256位
var iterations = 1000; //迭代次数
var encPassword = pbkdf2.pbkdf2Sync(password, salt, iterations, keyLen, "sha256"); //buffer类型
var hash = encPassword.toString("hex"); // "059b15100f56d0e7d8f8c0ebd1f9238fe63ae5fd17575a2bcd5c0d1f058f5949"
以上是JavaScript加密解密7种方法的总结分析,每种加密方法都包含了详细的代码示例,以便读者实践和参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript加密解密7种方法总结分析 - Python技术站