【问题标题】:NodeJS md5 'bytestring' like PHP md5(str, true)NodeJS md5 'bytestring' 像 PHP md5(str, true)
【发布时间】:2016-12-03 23:53:53
【问题描述】:

我遇到了以下问题:我尝试将一些字符串 str 转换为 md5 bytestring hash。在 PHP 中,我们可以使用 md5(str, true),但在 JS(nodejs express)中,我找不到某种方式来接收相同的结果。我已经包含了 npm 模块 js-md5,但是这个模块的 arrayBuffer 方法返回另一个结果(不同于 PHP md5(str, true))。

请有人帮助我。

谢谢

【问题讨论】:

    标签: javascript php node.js hash md5


    【解决方案1】:
    var md5 = require('md5');
    console.log(md5('text'))
    

    【讨论】:

      【解决方案2】:

      使用 CryptoJS 模块: NPM link here

      然后做类似的事情:

      // Requires
      var crypto = require('crypto');
      
      // Constructor
      function Crypto() {
          this.hash;
      }
      
      // Hash method
      Crypto.prototype.encode = function(data) {
          this.hash = crypto.createHash('md5').update(data);
          var result = this.hash.digest('hex');
          return result;
      };
      
      // Comparison method (return true if === else false)
      Crypto.prototype.equals = function(data, model) {
          var bool = false;
          var data = data.toUpperCase();
          var model = String(model).toUpperCase();
          if (data == model){
              bool = true;
          } else {
              bool = false;
          }
          return bool;
      };
      
      // Exports
      module.exports = Crypto;
      

      然后在您的代码中实例化这个“工具”对象并使用方法。
      像馅饼一样简单,使用其他加密方法(如 AES、SHA256 等)也可以完成同样的事情。
      关于 raw_output 选项(二进制答案,填充 16 位),您可以使用简单的函数轻松地将返回的 var 转换为二进制格式,请参阅this SO post 了解如何操作。 玩得开心。

      【讨论】:

        【解决方案3】:

        简答:

        const crypto = require('crypto');
        const buffer = crypto.createHash('md5').update(str).digest();
        

        长答案:你需要使用 NodeJS 的默认 crypto 模块(这里不需要依赖),它包含实用函数和类。它能够使用同步或异步方法为您创建散列(例如 MD5 或 SHA-1 散列)。一个名为crypto.createHash(algorithm) 的简短实用函数可用于以最少的编码创建散列。正如the docs 指定的那样:

        algorithm 取决于平台上 OpenSSL 版本支持的可用算法。例如'sha256''sha512' 等。在 OpenSSL 的最新版本中,openssl list-message-digest-algorithms 将显示可用的摘要算法。

        现在,这个createHash 函数返回一个Hash 对象,它可以与流(您可以向其提供文件、HTTP 请求等)或字符串一起使用,如您所要求的。如果要使用字符串,请使用hash.update(string) 对其进行哈希处理。此方法返回哈希本身,因此您可以将其与.digest(encoding) 链接以生成字符串(如果设置了encoding)或Buffer(如果未设置)。由于您要求字节,我相信 Buffer 是您想要的(Buffers 是 Uint8Array 实例)。

        【讨论】:

        • 你说的很对,我写的很着急,忘记了。请让我编辑我的答案。
        • 由于您的答案现在比旧的好得多,我删除了我之前的评论。谢谢 ;)。附加信息:不要尝试两次消化哈希,否则会出错。一个哈希只能被消化一次。例如,如果您比较两个密码,请注意对象的类型(如果它来自输入,则可能是字符串,但如果它来自诸如数据库结果集之类的对象,则可能是对象属性),这就是我创建“等于”的原因" 方法(受 Java 中的 .equals() 启发)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多