NodeJS加密算法(轉)


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);
 
 
 
2、Hmac算法加密:(主要用)

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、非對稱加密:這種方法還沒用到,待后面繼續補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM