nodejs中常用加密算法
1、Hash算法加密:
創建一個nodejs文件hash.js,輸入內容如下:
1 var crypto = require('crypto'); //加載crypto庫 2 console.log(crypto.getHashes()); //打印支持的hash算法
結果如下:

1 [ 'DSA', 2 'DSA-SHA', 3 'DSA-SHA1', 4 'DSA-SHA1-old', 5 'RSA-MD4', 6 'RSA-MD5', 7 'RSA-MDC2', 8 'RSA-RIPEMD160', 9 'RSA-SHA', 10 'RSA-SHA1', 11 'RSA-SHA1-2', 12 'RSA-SHA224', 13 'RSA-SHA256', 14 'RSA-SHA384', 15 'RSA-SHA512', 16 'dsaEncryption', 17 'dsaWithSHA', 18 'dsaWithSHA1', 19 'dss1', 20 'ecdsa-with-SHA1', 21 'md4', 22 'md4WithRSAEncryption', 23 'md5', 24 'md5WithRSAEncryption', 25 'mdc2', 26 'mdc2WithRSA', 27 'ripemd', 28 'ripemd160', 29 'ripemd160WithRSA', 30 'rmd160', 31 'sha', 32 'sha1', 33 'sha1WithRSAEncryption', 34 'sha224', 35 'sha224WithRSAEncryption', 36 'sha256', 37 'sha256WithRSAEncryption', 38 'sha384', 39 'sha384WithRSAEncryption', 40 'sha512', 41 'sha512WithRSAEncryption', 42 'shaWithRSAEncryption', 43 'ssl2-md5', 44 'ssl3-md5', 45 'ssl3-sha1', 46 'whirlpool' ]
在nodejs中使用:(createHash('md5')中的‘md5’可以換成襲擊需要的hash加密方法)
1 var content = 'password';//加密的明文; 2 var md5 = crypto.createHash('md5');//定義加密方式:md5不可逆,此處的md5可以換成任意hash加密的方法名稱; 3 md5.update(content); 4 var d = md5.digest('hex'); //加密后的值d 5 console.log("加密的結果:"+d);
HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code),HMAC運算利用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。HMAC可以有效防止一些類似md5的彩虹表等攻擊,比如一些常見的密碼直接MD5存入數據庫的,可能被反向破解。
定義HMAC需要一個加密用散列函數(表示為H,可以是MD5或者SHA-1)和一個密鑰K。我們用B來表示數據塊的字節數。(以上所提到的散列函數的分割數據塊字長B=64),用L來表示散列函數的輸出數據字節數(MD5中L=16,SHA-1中L=20)。鑒別密鑰的長度可以是小於等於數據塊字長的任何正整數值。應用程序中使用的密鑰長度若是比B大,則首先用使用散列函數H作用於它,然后用H輸出的L長度字符串作為在HMAC中實際使用的密鑰。一般情況下,推薦的最小密鑰K長度是L個字節。
下面為我在項目中使用到的Hmac加密(采用sha1方式):(由於密鑰會通過隨機生成的16位數進行加密后再對明文加密,每次生成的新密鑰(token)都不同,所以最后生成的密文也不會相同,這種加密不可逆,
即使為md5方式,也難以通過彩虹表來攻擊)
/********hmac-sha1加密***************/ var content = 'password';//加密的明文; var token1='miyue';//加密的密鑰; var buf = crypto.randomBytes(16); token1 = buf.toString('hex');//密鑰加密; console.log("生成的token(用於加密的密鑰):"+token1); var SecrectKey=token1;//秘鑰; var Signture = crypto.createHmac('sha1', SecrectKey);//定義加密方式 Signture.update(content); var miwen=Signture.digest().toString('base64');//生成的密文后將再次作為明文再通過pbkdf2算法迭代加密; console.log("加密的結果f:"+miwen); /**********對應的結果(每次生成的結果都不一樣)******************/ 生成的token(用於加密的密鑰):de7c3dafede518a1ad9c2096ee9b4eff 加密的結果f:PUX7fnOMlqVj+BS9o6RnNgxfffY=
生成的token(用於加密的密鑰):93fee046ebf47412c2d54c1e808218d2
加密的結果f:/ERkUcrjkwxzgxNM7WczU8RaX5o=
3、對稱加密和非對稱加密:
- 對稱加密算法的原理很容易理解,通信一方用KEK加密明文,另一方收到之后用同樣的KEY來解密就可以得到明文。
- 不對稱加密算法,使用兩把完全不同但又是完全匹配的一對Key:公鑰和私鑰。在使用不對稱加密算法加密文件時,只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程。
3.1:對稱加密:
創建一個nodejs文件cipher.js,輸入內容如下:
var crypto = require('crypto'); //加載crypto庫 console.log(crypto.getCiphers()); //打印支持的cipher算法

1 [ 'CAST-cbc', 2 'aes-128-cbc', 3 'aes-128-cfb', 4 'aes-128-cfb1', 5 'aes-128-cfb8', 6 'aes-128-ctr', 7 'aes-128-ecb', 8 'aes-128-gcm', 9 'aes-128-ofb', 10 'aes-128-xts', 11 'aes-192-cbc', 12 'aes-192-cfb', 13 'aes-192-cfb1', 14 'aes-192-cfb8', 15 'aes-192-ctr', 16 'aes-192-ecb', 17 'aes-192-gcm', 18 'aes-192-ofb', 19 'aes-256-cbc', 20 'aes-256-cfb', 21 'aes-256-cfb1', 22 'aes-256-cfb8', 23 'aes-256-ctr', 24 'aes-256-ecb', 25 'aes-256-gcm', 26 'aes-256-ofb', 27 'aes-256-xts', 28 'aes128', 29 'aes192', 30 'aes256', 31 'bf', 32 'bf-cbc', 33 'bf-cfb', 34 'bf-ecb', 35 'bf-ofb', 36 'blowfish', 37 'camellia-128-cbc', 38 'camellia-128-cfb', 39 'camellia-128-cfb1', 40 'camellia-128-cfb8', 41 'camellia-128-ecb', 42 'camellia-128-ofb', 43 'camellia-192-cbc', 44 'camellia-192-cfb', 45 'camellia-192-cfb1', 46 'camellia-192-cfb8', 47 'camellia-192-ecb', 48 'camellia-192-ofb', 49 'camellia-256-cbc', 50 'camellia-256-cfb', 51 'camellia-256-cfb1', 52 'camellia-256-cfb8', 53 'camellia-256-ecb', 54 'camellia-256-ofb', 55 'camellia128', 56 'camellia192', 57 'camellia256', 58 'cast', 59 'cast-cbc', 60 'cast5-cbc', 61 'cast5-cfb', 62 'cast5-ecb', 63 'cast5-ofb', 64 'des', 65 'des-cbc', 66 'des-cfb', 67 'des-cfb1', 68 'des-cfb8', 69 'des-ecb', 70 'des-ede', 71 'des-ede-cbc', 72 'des-ede-cfb', 73 'des-ede-ofb', 74 'des-ede3', 75 'des-ede3-cbc', 76 'des-ede3-cfb', 77 'des-ede3-cfb1', 78 'des-ede3-cfb8', 79 'des-ede3-ofb', 80 'des-ofb', 81 'des3', 82 'desx', 83 'desx-cbc', 84 'id-aes128-GCM', 85 'id-aes192-GCM', 86 'id-aes256-GCM', 87 'idea', 88 'idea-cbc', 89 'idea-cfb', 90 'idea-ecb', 91 'idea-ofb', 92 'rc2', 93 'rc2-40-cbc', 94 'rc2-64-cbc', 95 'rc2-cbc', 96 'rc2-cfb', 97 'rc2-ecb', 98 'rc2-ofb', 99 'rc4', 100 'rc4-40', 101 'rc4-hmac-md5', 102 'seed', 103 'seed-cbc', 104 'seed-cfb', 105 'seed-ecb', 106 'seed-ofb' ]
下面是我在項目中用到的對稱加密算法:
//在app.js中配置路由 ... var jiami=require("./routes/jiami"); .... app.use("/jiami",jiami);
在service中請求node端路由:
1 $http.post("/app/jiami/encrypt",{str:JSON.stringify(user)}).success(function(miwen){ 2 // console.log("返回的密文:"+miwen); 3 }).error(function(error){ 4 return deferred.reject(error); 5 });

1 var secret='pass';//密鑰 2 3 //加密 4 router.post("/encrypt",function(req,res){ 5 var str=req.body.str;//明文 6 var cipher = crypto.createCipher('aes192', secret); 7 var enc = cipher.update(str, 'utf8', 'hex');//編碼方式從utf-8轉為hex; 8 enc += cipher.final('hex');//編碼方式從轉為hex; 9 res.send(enc); 10 }); 11 //解密 12 router.post("/decrypt",function(req,res){ 13 var str=req.body.str;//明文 14 var decipher = crypto.createDecipher('aes192', secret); 15 var dec = decipher.update(str, 'hex', 'utf8');//編碼方式從hex轉為utf-8; 16 dec += decipher.final('utf8');//編碼方式從utf-8; 17 res.send(dec); 18 });
3.2、非對稱加密:這種方法還沒用到,待后面繼續補充。