一、常見的JavaScript加密方式
加密在前端開發和爬蟲中是經常遇見的。掌握了加密算法且可以將加密的密文進行解密破解的,也是我們從一個編程小白到大神級別的一個質的飛躍。且加密算法的熟練程度和剖析也是有助於我們實現高效的js逆向。
-
線性散列算法(簽名算法)
MD5
-
對稱加密算法
AED
DES
-
非對稱加密算法
RAS
-
base64
偽加密 -
證書密鑰加密
https
加密
二、線性散列算法MD5
1. 概念
MD5
是一種被廣泛使用的線性散列算法,可以產生出一個128位(16字節)的散列值(hash value),用於確保信息傳輸的一致性。且MD5
加密后產生的是一個固定長度(32位或16位)的數據
2. 解密
常規來講MD5
是不存在解密的。但是理論上MD5
是可以進行反向暴力破解的。暴力破解的大致原理就是用很多數據進行加密后跟已有的加密數據進行比對,由此來尋找規律。理論上只要數據量足夠龐大,MD5
是可以被破解的。但是要注意的是,破解MD5
是需要考慮破解的成本的(時間和機器性能)。假設破解當前的MD5
需要目前計算能力最優秀的的計算機工作100年才能完成破解完成,那么當前的MD5
密碼是安全的。
3. 增加解密難度
我們在注冊賬號時的密碼一般都是用
MD5
加密的
- 使用一段無意義且隨機的私鑰(鹽)進行
MD5
加密生成一個加密串(串1) - 將要加密的數據與串1拼接,再進行
MD5
加密生成加密串(串2) - 將串2再次進行
MD5
加密,這是生成的加密串(串3)就是我們加密后的數據
4. js
代碼示例
<html>
<script src='https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js'></script>
<script type='text/javascript'>
var hashCode = md5('i am superman');
alert(hashCode); // d5ea627a05a126ce1806a00ee9a3eba1
</script>
</html>
三、對稱加密算法DES
/AES
1. 概念
DES
全稱Data Encryption Standard,即數據加密標准,是一種使用密鑰加密的算法。該加密算法是一種對稱加密方式,其加密運算、解密運算需要使用的是同樣的密鑰(一組字符串)即可。
2. 解密
使用
DES
/AES
進行數據交互時需要雙方都擁有相同的私鑰
- 暴力破解
DES
如果使用56位的密鑰,則可能的密鑰數量是2的56次方個。只要計算足夠強大是可以被破解的。
3. DES
和AES
的區別
-
加密后的長度不同
DES
加密后密文長度是8的整數倍AES
加密后密文長度是16的整數倍
-
應用場景不同
- 企業級開發使用
DES
足夠安全 - 如果要求更高則使用
AES
- 企業級開發使用
-
DES
和AES
進行數據交互時需要雙方都擁有相同的私鑰
4. DES
算法參數詳解
Key、Data、Mode、padding
Key
是7個字節共56位,是DES
算法的工作密鑰Data
是8個字節共56位,是要被加密或被解密的數據Mode
是DES
的工作模式padding
是填充模式,如果加密后密文長度達不到指定整數倍(8個字節、16個字節),填充對應字符【padding的復制固定為CryptoJS.pad.Pkcs7
】
5. js
代碼示例
<html>
<script src='https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js'></script>
<script type='text/javascript'>
var aseKey = '12345678'; // 定制私鑰,長度必須為8/16/32位
var message = 'how are you? i am fine,and you?';
// 加密 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); // 加密后的串:zTFKeiIgvJC/zVnJX1uQBUtOMqCHdE00q6e6AtCPvfY=
// 解密
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); // 解密后的串:how are you? i am fine,and you?
</script>
</html>
四、非對稱加密算法RSA
1. 概念
RSA
加密算法是一種非對稱加密算法。在公開密鑰解密和電子商業中RSA
算法被廣泛使用。非對稱加密算法需要兩個密鑰。
-
公開密鑰(
publickey
:簡稱公鑰) -
私有密鑰(
privatekey
:簡稱私鑰) -
公鑰和私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫做非對稱加密算法。
2. 使用流程&應用場景
- 通過公鑰加密,使用私鑰解密。私鑰是通過公鑰計算生成的。假設ABC三方之間相互進行加密通信,三人相互之間使用公鑰對信息進行加密,信息讀取時使用各自對應的私鑰進行信息解密
- 用戶輸入的支付密碼會通過
RSA
加密
3. 注意
- 使用時都是用公鑰加密數據,用私鑰解密數據。公鑰是可以公開的,私鑰自己保留。
- 算法強度復雜、安全性依賴於算法與密鑰,但是由於算法復雜,使得加密解密速度沒有對稱加密解密速度快。
4. 在線生成RSA
串
http://web.chacuo.net/netrsakeypair/
5. js
代碼示例
<html>
<script src='https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js'></script>
<script type='text/javascript'>
// 公鑰
var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD3+A0MhtljS331iaa7Y7dEt9WFJYJdHk+B753nrdMUdOGMGPuWeAekkKLI4cDGEX/sktLTsQullJJvi5+kBXT2hehvaekyraoytkiSmUVjXq2yFSw3j8xjFyK5ye9/suPonA9v/rmDiSy+bnWgsEyikni+Y1yUbcy/f0YX2rJ81wIDAQAB-----END PUBLIC KEY-----';
// 私鑰
var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAPf4DQyG2WNLffWJprtjt0S31YUlgl0eT4Hvneet0xR04YwY+5Z4B6SQosjhwMYRf+yS0tOxC6WUkm+Ln6QFdPaF6G9p6TKtqjK2SJKZRWNerbIVLDePzGMXIrnJ73+y4+icD2/+uYOJLL5udaCwTKKSeL5jXJRtzL9/RhfasnzXAgMBAAECgYEAvf360YxI6AGhow4zCAUhGK/aE8hnmD1vIdmcnTTcNCJR5mwF6IZTJM4FS/FdKOWjpHniu3w9tkKd6IWMbboYoIBcfoha5/qZ6IOum8kjimUJXc34ipVl0Y4hwLTNcFg7S3kyA19XeH3Xp+IQ5aizhFx8/aNhFQKPwKEX/vI9OqECQQD/T9D7/yPk+fS5i5q/uduRd9oJoTFKjoFrSpj/1rOZtCGFIwdFi9CtQzvzch/fGAFL580GWbJwJCaUz7py+vrJAkEA+KMq49vCwJABeVT6a6mNCiKB4Qhdkm+yMoA7L1suDnY/CXoitU9OhSkoIcqjthEr/KVYWDxWV+R5d0qSQG3qnwJBAKOZdrXzkQGp9dprjbbrlroJTcs74kT/OgkRXScbYizM02nnv0IeTJKp8aGW8LtZO4NzPtqh4YigcaSL09LX5pkCQFz9sanc5F7evR5i8PHZTP2wYEEIvu5oxg3rNbeFc5lHElZ6DocfLS/Sb8cLoeUTUQ9By+PcVTK0KdW61y4vreMCQQC/vqDH6hvWNjUwdsmwOIOgd9Pgn5UNLKweHf9Mhp0DfmsrWQ6mj66juhsZCP0YvFYUuZ+FSaczINelBh8Ghfhl-----END PRIVATE KEY-----';
// 使用公鑰加密
var encrypt = new JSEncrypt(); // 實例化加密對象
encrypt.setPublicKey(PUBLIC_KEY); // 設置公鑰
var encrypted = encrypt.encrypt('how are you?'); // 對指定的數據進行加密
alert(encrypted); // Tpe/tER7SjOeDL0IF3SwpnEqLndN7shYqq4J0fchvVonIEJId49g+qSRJg5swYn2Jijc79vr7t1FZZ48Dbs8A88vWPxUifTAImvWRoZm3DZQ8PlGfW0gxdrozcfPmWU1EvduJffkiqnJCei58k2yxY2LapXFDfiXCAkZJQKeWCM=
// 使用私鑰解密
var decrtypt = new JSEncrypt();
decrtypt.setPrivateKey(PRIVATE_KEY); // 設置私鑰
var uncrypted = decrtypt.decrypt(encrypted); // 解密
alert(uncrypted); // how are you?
</script>
</html>
五、base64
偽加密
1. 概念
base64
是一種用64個字符來表示任意二進制數據的方法。base64
是一種編碼方式而不是加密算法。只是看上去像是加密而已
base64
使用A~Z、a~z、0~9、+、/、=
這64個字符實現對數據進行加密。
2. js
代碼實現
<html>
<script src='https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js'></script>
<script type='text/javascript'>
// 創建Base64對象(此處不完整)
var Base64 = {
base64: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
encode: function($input) {
if (!$input) {
return false;
}
var $output = "";
var $chr1, $chr2, $chr3;
var $enc1, $enc2, $enc3, $enc4;
var $i = 0;
do {
$chr1 = $input.charCodeAt($i++);
$chr2 = $input.charCodeAt($i++);
$chr3 = $input.charCodeAt($i++);
$enc1 = $chr1 >> 2;
$enc2 = (($chr1 & 3) << 4) | ($chr2 >> 4);
$enc3 = (($chr2 & 15) << 2) | ($chr3 >> 6);
$enc4 = $chr3 & 63;
if (isNaN($chr2)) $enc3 = $enc4 = 64;
else if (isNaN($chr3)) $enc4 = 64;
$output += this.base64.charAt($enc1) + this.base64.charAt($enc2) + this.base64.charAt($enc3) + this.base64.charAt($enc4);
} while ($i < $input.length);
return $output;
},
decode: function($input) {
if(!$input) return false;
$input = $input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
var $output = "";
var $enc1, $enc2, $enc3, $enc4;
var $i = 0;
do {
$enc1 = this.base64.indexOf($input.charAt($i++));
$enc2 = this.base64.indexOf($input.charAt($i++));
$enc3 = this.base64.indexOf($input.charAt($i++));
$enc4 = this.base64.indexOf($input.charAt($i++));
$output += String.fromCharCode(($enc1 << 2) | ($enc2 >> 4));
if ($enc3 != 64) $output += String.fromCharCode((($enc2 & 15) << 4) | ($enc3 >> 2));
if ($enc4 != 64) $output += String.fromCharCode((($enc3 & 3) << 6) | $enc4);
} while ($i < $input.length);
return $output;
}
};
// 定義字符串
var string = 'how are you?';
// 加密
var encodedString = Base64.encode(string);
alert(encodedString); // aG93IGFyZSB5b3U/
// 解密
var decodedString = Base64.decode(encodedString);
alert(decodedString); // how are you?
</script>
</html>