由于HUSTOJ使用binary sha1以及BASE64加盐进行加密,我曾经尝试用crypto在Node.js上实现功能与之相同的模块。然而按照API 说明操作并不能成功生成对应的内容。经过对Buffer转码密文发现,在对BASE64密文进行解密时,应使用ASCII编码进行解密,而在对明文加密时,则应该用UTF-8进行加密。
实现如下:
[code lang=javascript]
const crypto = require("crypto");
const checkPassword = (originalPassword, inputPassword, newpassword) => {
const convertedOriginalPasswordAscii = new Buffer(originalPassword, "base64").toString("ascii");
const convertedOriginalPassword = new Buffer(originalPassword, "base64").toString();
const salt = convertedOriginalPasswordAscii.substring(20);
const SHA1Password = crypto.createHash("sha1")
.update(crypto.createHash("md5")
.update(inputPassword)
.digest("hex") + salt)
.digest() + salt;
return SHA1Password === convertedOriginalPassword || newpassword === inputPassword;
};
[/code]