使用node.js的Crypto模块Hmac算法对信息进行认证
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
算法过程如下:
- 随机生成16位随机数,作为密钥。
- 密码加密
- 密钥对文本进行sha1加密
- 传输
认证流程
- 先由客户端向服务器发出一个验证请求。
- 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
- 客户端将收到的随机数。使用该随机数与用户输入的的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
- 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。
Signture = require("crypto")
.createHmac("sha1", SecrectKey)
.update(content)
.digest()
.toString("base64");
有效防止彩虹表攻击。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。