node.js 如何重现 PHP MD5 加密
node.js how to repreduce PHP MD5 encryption
我正在将现有的基于 php 的网站转换为 node.js 应用程序,我需要将此加密方法从 php 复制到 js。
private static $_passwordSalt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
public static function getCryptedPassword($password = 'password') {
return sha1(md5(self::$_passwordSalt.$password));
}
到目前为止,我已经试过了,但 return 结果不同:
UserSchema.methods.hashPassword = function(password) {
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer'
var md5Hash = md5(password + salt);
var hash = sha1(md5Hash);
return hash;
};
使用加密模块试试这个:
var crypto = require('crypto');
UserSchema.methods.hashPassword = function(password) {
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
var hashStr = password + salt;
var md5Hash = crypto.createHash('md5').update(hashStr).digest('hex');
var sha1 = crypto.createHash('sha1').update(md5Hash).digest('hex');
console.log(sha1);
return sha1;
};
您需要考虑哈希算法适用于字节值,而您使用的是字符串值。这意味着编码将在这里发挥作用,据我所知,PHP 默认使用 latin1,而 node.js 使用 utf-8。
crypto.createHash('md5').update(hashStr, 'ascii').digest('hex')
我不确定 ascii 是否只处理 7 位 ascii 或像 latin1 这样的实际扩展字符集,但它似乎是 update()
方法中唯一直接支持的字符集。如果您需要控制扩展字符集,您应该从正确的编码创建一个 Buffer,并将其用作 update()
的参数。 node.js 中的内置支持相当有限:
Buffer.isEncoding = function(encoding) {
switch ((encoding + '').toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
case 'raw':
return true;
default:
return false;
}
};
您应该考虑使用其他工具来转换它。此线程 (List of encodings that Node.js supports) 建议使用 iconv 或 iconv-lite。
当然,这同样适用于 SHA1,但由于您在 MD5 的十六进制表示上使用 SHA1,它永远不会脱离 7 位 ascii(其中 latin1 和 utf-8 会产生相同的字节顺序)。
请试试这些:
var crypto = require('crypto');
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer'
var password = 'pass';
var hashMd5 = crypto.createHash('md5').update(salt + password).digest("hex");
var hasSha1 = crypto.createHash('sha1').update(hasMd5).digest("hex");
console.log(hashSha1);
作为文件:hash.js
作为 hash.php 这些代码:
<?php
$_passwordSalt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
$password = 'pass';
//echo md5("phinware");
echo sha1(md5($_passwordSalt.$password));
echo "\n";
然后执行两个文件:
- > php hash.php
- >节点hash.js
我的结果:
两个:3cbd1242e8e510a16f39d7e0bfd18a0e03d0de3f
这是正确的解决方案
var md5 = require('MD5'),
sha1 = require('sha1');
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
var hash = sha1(md5(salt+password));
return hash;
php:
$a = 'a';
$b = 'b';
echo md5($a.$b);
等于node.js:
var crypto = require('crypto');
var a = 'b', b = 'b';
var md5 = crypto.createHash('md5');
md5.update(xml, 'utf8');
md5.update(config.secret, 'utf8');
console.log(md5.digest('hex'));
我正在将现有的基于 php 的网站转换为 node.js 应用程序,我需要将此加密方法从 php 复制到 js。
private static $_passwordSalt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
public static function getCryptedPassword($password = 'password') {
return sha1(md5(self::$_passwordSalt.$password));
}
到目前为止,我已经试过了,但 return 结果不同:
UserSchema.methods.hashPassword = function(password) {
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer'
var md5Hash = md5(password + salt);
var hash = sha1(md5Hash);
return hash;
};
使用加密模块试试这个:
var crypto = require('crypto');
UserSchema.methods.hashPassword = function(password) {
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
var hashStr = password + salt;
var md5Hash = crypto.createHash('md5').update(hashStr).digest('hex');
var sha1 = crypto.createHash('sha1').update(md5Hash).digest('hex');
console.log(sha1);
return sha1;
};
您需要考虑哈希算法适用于字节值,而您使用的是字符串值。这意味着编码将在这里发挥作用,据我所知,PHP 默认使用 latin1,而 node.js 使用 utf-8。
crypto.createHash('md5').update(hashStr, 'ascii').digest('hex')
我不确定 ascii 是否只处理 7 位 ascii 或像 latin1 这样的实际扩展字符集,但它似乎是 update()
方法中唯一直接支持的字符集。如果您需要控制扩展字符集,您应该从正确的编码创建一个 Buffer,并将其用作 update()
的参数。 node.js 中的内置支持相当有限:
Buffer.isEncoding = function(encoding) {
switch ((encoding + '').toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
case 'raw':
return true;
default:
return false;
}
};
您应该考虑使用其他工具来转换它。此线程 (List of encodings that Node.js supports) 建议使用 iconv 或 iconv-lite。
当然,这同样适用于 SHA1,但由于您在 MD5 的十六进制表示上使用 SHA1,它永远不会脱离 7 位 ascii(其中 latin1 和 utf-8 会产生相同的字节顺序)。
请试试这些:
var crypto = require('crypto');
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer'
var password = 'pass';
var hashMd5 = crypto.createHash('md5').update(salt + password).digest("hex");
var hasSha1 = crypto.createHash('sha1').update(hasMd5).digest("hex");
console.log(hashSha1);
作为文件:hash.js
作为 hash.php 这些代码:
<?php
$_passwordSalt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
$password = 'pass';
//echo md5("phinware");
echo sha1(md5($_passwordSalt.$password));
echo "\n";
然后执行两个文件:
- > php hash.php
- >节点hash.js
我的结果:
两个:3cbd1242e8e510a16f39d7e0bfd18a0e03d0de3f
这是正确的解决方案
var md5 = require('MD5'),
sha1 = require('sha1');
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOUwer';
var hash = sha1(md5(salt+password));
return hash;
php:
$a = 'a';
$b = 'b';
echo md5($a.$b);
等于node.js:
var crypto = require('crypto');
var a = 'b', b = 'b';
var md5 = crypto.createHash('md5');
md5.update(xml, 'utf8');
md5.update(config.secret, 'utf8');
console.log(md5.digest('hex'));