nodejs中常用加密算法

在常用的nodejs+express工程中,为了安全在登录及表单传输时,应该都需进行加密传输,目前个人常用到的加密方式有下列几种:

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' ]
View Code

  在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' ]
View Code

 下面是我在项目中用到的对称加密算法:

//在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 });
jiami.js

 3.2、非对称加密:这种方法还没用到,待后面继续补充。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(nodejs)