【问题标题】:node.js how to repreduce PHP MD5 encryptionnode.js 如何重新减少 PHP MD5 加密
【发布时间】:2015-05-13 17:44:05
【问题描述】:

我正在将现有的基于 php 的网站转换为 node.js 应用程序,我需要将这种加密方法从 php 复制到 js。

private static $_passwordSalt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOU$3wer';
public static function getCryptedPassword($password = 'password') {
    return sha1(md5(self::$_passwordSalt.$password));
}

到目前为止,我已经尝试过了,但它没有返回相同的结果:

UserSchema.methods.hashPassword = function(password) {
        var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOU$3wer'
        var md5Hash = md5(password + salt);
        var hash = sha1(md5Hash);
        return hash;
};

【问题讨论】:

  • 首先,您在 PHP 中使用 md5(salt, password),在 JavaScript 中使用 md5(password, salt)
  • 我尝试了所有不同的组合:md5(salt,password),md5(password,salt),sh1(md5,salt),sha1(salt,md5),但还是不行跨度>
  • 您不应该使用 md5 或 sha1 或两者的任何组合来存储密码。在 PHP 中,存储密码的最佳方式是 password_hash(),它(当前)使用 bcryt。这是 bcrypt 的 node.js 实现:github.com/shaneGirish/bcrypt-nodejs
  • 您知道这是一种非常不安全的密码处理方式吗?静态盐实际上不是盐,而且 MD5 对密码进行哈希处理的速度太快了,你可以暴力破解8 Giga MD5/s。您应该使用带有成本因子的慢速散列函数,请参阅password_hash() 函数。

标签: php node.js md5 salt password-encryption


【解决方案1】:

请试试这些:

    var crypto = require('crypto');
var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOU$3wer'
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"LOU$3wer';
$password = 'pass';

//echo md5("phinware");
echo sha1(md5($_passwordSalt.$password));
echo "\n";

然后执行这两个文件:

  • > php hash.php
  • >节点hash.js

我的结果:

两者:3cbd1242e8e510a16f39d7e0bfd18a0e03d0de3f

【讨论】:

    【解决方案2】:

    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'));
    

    【讨论】:

      【解决方案3】:

      使用加密模块试试这个:

      var crypto = require('crypto');
      
      UserSchema.methods.hashPassword = function(password) {
          var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOU$3wer';
          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;
      };
      

      【讨论】:

      • 不,这会返回一个字符较少的字符串,所以我认为它是错误的。我试图用 sha1 加密来包装它,但它仍然是错误的
      【解决方案4】:

      您需要考虑哈希算法适用于字节值,并且您使用的是字符串值。这意味着编码将在这里发挥作用,据我所知,PHP 默认使用 latin1,而 node.js 使用 utf-8。

      crypto.createHash('md5').update(hashStr, 'ascii').digest('hex')
      

      我不确定 ascii 是只处理 7 位 ascii 还是像 latin1 这样的实际扩展字符集,但它似乎是 update() 方法中唯一直接支持的字符集。如果您需要控制扩展字符集,您应该从正确的编码创建一个缓冲区,并将其用作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 会产生相同的字节序列) .

      【讨论】:

        【解决方案5】:

        这是正确的解决方案

        var md5 = require('MD5'),
            sha1 = require('sha1');
        
        var salt = 'd2g6IOP(U(&§)%U§VUIPU(HN%V/§§URerjh0ürfqw4zoöqe54gß0äQ"LOU$3wer';
        var hash = sha1(md5(salt+password));
        return hash;
        

        【讨论】:

          猜你喜欢
          • 2011-05-24
          • 2014-07-02
          • 1970-01-01
          • 2012-09-21
          • 1970-01-01
          • 2014-01-26
          • 1970-01-01
          • 2019-10-10
          • 2014-05-03
          相关资源
          最近更新 更多