常见加密算法
js常见的加密方式
常见的加密算法基本分为几类
- 线性散列算法(签名算法)MD5
- 对称性加密算法AES DES
- 非对称性加密算法 RSA
Md5加密
MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)的数据。
一般登录密码使用MD5加密
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script> <script type="text/javascript"> var hashCode = md5("I am tian") alert(hashCode) </script> </body> </html>
AES 、DES对称加密
DES数据加密标准,是一种使用密钥加密的算法,该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密匙(一组字符串)
AES和DES的区别:
加密后密文长度不同:
- DES加密后密文长度是8的整数倍
- AES加密后密文长度是16的整数倍
应用场景不同:
- 企业级开发使用DES足够安全
- 如果要求高使用AES
DES算法的入口参数有三个:Key、Data、Mode 、padding
- Key为7个字节共56位,是DES算法的工作秘钥;
- Data为8个字节64位,是要被加密或被解密的数据;
- Mode为DES的工作方式
- padding为填充模式,如果加密后密文长度如果达不到指定整数倍(8个字节、16个字节),填充对应字符
- padding的赋值固定为CryptoJS.pad.Pkcs7即可
- 使用DES/AES进行数据交换时要求双方都拥有相同的私钥。
<!DOCTYPE html> <html lang="en"> <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script> <script type="text/javascript"> var aseKey = "123456"; //定制私钥,长度必须为:8/16/32位 var message = "tian"; // 加密的数据 // 加密DES/AES切换只需要修改CryptoJS.AES <==> CryptoJS.DES var encrypt = CryptoJS.DES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); alert(encrypt) //解密 关键字DES.decrypt() var decrypt = CryptoJS.DES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); alert(decrypt); //密码 </script> </html>
RSA加密
RSA加密算法是一种非对称加密算法。
非对称加密算法:
- 非对称加密算法需要两个密钥:
- 公开密钥(publickey简称公钥)
- 私有密钥(privatekey简称私钥)
- 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法
注意:
使用时都是使用公钥加密使用私钥解密。公钥可以公开,私钥自己保留。
使用流程和场景介绍
通过公钥加密,使用私钥解密。私钥是通过公钥计算生成的。假设ABC三方之间相互要进行加密通信。大家相互之间使用公钥进行信息加密,信息读取时使用各自对应的私钥进行信息解密。
公钥私钥生成方式:
公私钥可以在线生成:http://web.chacuo.net/netrsakeypair
<!DOCTYPE html> <html lang="en"> <script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script> <script type="text/javascript"> //公钥 var PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrAHrJgeFRyaj0aQNHHZRvVeEW\n' + 'sOnIHqb98rPWeXM9uoA1adanAqy++vLsLZ76YUyk1qpwVZdvWLbwReK3/aehhWrl\n' + 'm8SYUStHwKsBa3PkhLU4xADzYddSMdlhoJJv+scmuFj88x7FpK97WYZU1O1MiGZl\n' + 'lUTbo46LwUQtuy7+GQIDAQAB'; // 私钥 var PRIVATE_KEY = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOsAesmB4VHJqPRp\n' + 'A0cdlG9V4Raw6cgepv3ys9Z5cz26gDVp1qcCrL768uwtnvphTKTWqnBVl29YtvBF\n' + '4rf9p6GFauWbxJhRK0fAqwFrc+SEtTjEAPNh11Ix2WGgkm/6xya4WPzzHsWkr3tZ\n' + 'hlTU7UyIZmWVRNujjovBRC27Lv4ZAgMBAAECgYBOaf6OtpPkopGJ3HCHjks1S0as\n' + 'N6QKbo/yNMXlTukxM8YMDKDfYXka0Mm2HRLrIQReDHMawLSjJssEKY2ZLz57dy0I\n' + 'tHHSBJ6RveGjGOQFZqKfblF60bKis9nYzJfIDY46mzII6u4FG8e8bp3/UvGlZ9Px\n' + 'fh5A1eXOhJF99WYcAQJBAP3IJrGCvOXx1KIBNXuySiC25RevY0lykzTft4aS9sGE\n' + 'qjHRZia87emMznWZl3rPA4RveVgyHU7WRGLUI4WHELkCQQDtDk6zoMrQUNXTF7vM\n' + 'dZ+ynV86bRVfdYFV5GXM0jtNsjZc5Lm4NmMoswnoKFOzW6upVvLFJ1v+Y0iy9Y8p\n' + 'quhhAkAXkip93D29QbvVHDWieonGBha7H3AiV0Dy7UB3gFjo2nCQVfmd6XhTc9+N\n' + 'LqnSHz4dY9kqZuUv+Fi7sSZndYcJAkAuzGZJG/MuEOdFlyfiA06Vqm/ETwirIb14\n' + 'wXA/cTl36zjEOftYHJSS0lWgWWW8wNowwhOHTG/i1qLhgYzTwwPBAkEAwYI0hk4e\n' + 'WRgAxitf/FICc23nJhIgODniHNsp3zuUQJxDlFYI0E7jRcTr4/ir22eA1IVpGNt/\n' + '3HrpUB0E1zx6lg=='; // 使用公钥加密 var encrypt = new JSEncrypt(); // 实例化加密对象 encrypt.setPublicKey(PUBLIC_KEY); // 设置公钥 var encrypted = encrypt.encrypt('hello tian'); // 对指定数据进行加密 alert(encrypted); // 使用私钥解密 var decrpyt = new JSEncrypt(); decrpyt.setPrivateKey(PRIVATE_KEY); //设置私钥 var uncrypted = decrpyt.decrypt(encrypted);// 解密 alert(uncrypted); </script> </html>
base64伪加密
Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已,‘’
Base64使用A-Z, a-z , 0-9 , +, / 这64个字符实现对数据进行加密。