牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-07-03 投稿人: 浏览次数:2557
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" ]

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

  • 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");

有效防止彩虹表攻击。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。