使用node.js的Crypto模块Hmac算法对信息进行认证

来源:互联网 发布:怎么才能加入淘宝 编辑:程序博客网 时间:2024/06/16 06:18

1.引入 crypto模块

var crypto = require('crypto');console.log(crypto.getHashes()); //打印支持的hash算法

运行结果:

[ 'DSA',  'DSA-SHA',  'DSA-SHA1',  'DSA-SHA1-old',  'RSA-MD4',  'RSA-MD5',  'RSA-MDC2',  'RSA-RIPEMD160',  'RSA-SHA',  'RSA-SHA1',  'RSA-SHA1-2',  'RSA-SHA224',  'RSA-SHA256',  'RSA-SHA384',  'RSA-SHA512',  'dsaEncryption',  'dsaWithSHA',  'dsaWithSHA1',  'dss1',  'ecdsa-with-SHA1',  'md4',  'md4WithRSAEncryption',  'md5',  'md5WithRSAEncryption',  'mdc2',  'mdc2WithRSA',  'ripemd',  'ripemd160',  'ripemd160WithRSA',  'rmd160',  'sha',  'sha1',  'sha1WithRSAEncryption',  'sha224',  'sha224WithRSAEncryption',  'sha256',  'sha256WithRSAEncryption',  'sha384',  'sha384WithRSAEncryption',  'sha512',  'sha512WithRSAEncryption',  'shaWithRSAEncryption',  'ssl2-md5',  'ssl3-md5',  'ssl3-sha1',  'whirlpool' ]

2.一些加密算法

《密码学》课上,老师讲了主要的信息认证方法

  • md5消息认证
  • md5加盐消息认证
  • sha消息认证

(1)md5

md5的认证是不可逆的。一个明文生成的密文是唯一的。只有两个明文相同,他们的密文才能相同。但是,攻击者可以使用彩虹表来攻击(暴力穷举呗)。越来越不安全。

var crypto = require('crypto');//明文文本var content = 'password'//创建MD5加密方式var md5 = crypto.createHash('md5');//加密过程md5.update(content);//d为输出的最终密文var d = md5.digest('hex');  

既然不再安全,就不推荐使用了。

(2)sha1

var crypto = require('crypto');var content = 'password'//创建sha1加密方式var shasum = crypto.createHash('sha1');shasum.update(content);var d = shasum.digest('hex');

MD5与sha1的不同点

  • MD5 使用小端排序LITTLE-ENDIAN,sha1 使用大端排序BIG-ENDIAN
  • MD5最后生成的摘要信息是16个字节,SHA1是20个字节。

(3)hmac

算法过程如下:

  1. 随机生成16位随机数,作为密钥。
  2. 密码加密
  3. 密钥对文本进行sha1加密
  4. 传输

认证流程

  1. 先由客户端向服务器发出一个验证请求。
  2. 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
  3. 客户端将收到的随机数。使用该随机数与用户输入的的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
  4. 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。
Signture = require('crypto')    .createHmac('sha1', SecrectKey)    .update(content)    .digest()    .toString('base64');

有效防止彩虹表攻击。

0 0
原创粉丝点击