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個字符實現對數據進行加密。
