【问题标题】:Hashing a password using SHA256 and .NET/Node.js使用 SHA256 和 .NET/Node.js 对密码进行哈希处理
【发布时间】:2012-11-22 17:45:33
【问题描述】:

我将用户密码的 SHA256 哈希值存储在由 .NET 生成的数据库中,我需要能够使用 Node.js 来检查它们。唯一的问题是 .NET 和 Node.js 为相同的密码创建了不同的哈希值。

Password: ThisPassword  

.NET:

var ue = new UnicodeEncoding();  
var byteSourceText = ue.GetBytes("ThisPassword");  
var byteHash = new System.Security.Cryptography.SHA256Managed().ComputeHash(byteSourceText);  
return Convert.ToBase64String(byteHash);

//Tlwxyd7HIQhXkN6DrWJtmB9Ag2fz84P/QgMtbi9XS6Q=

Node.js(使用加密):

var crypto = require('crypto');
return crypto.createHash('sha256').update('ThisPassword').digest('base64')

//d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=

我找到了this,但无法弄清楚如何实施他的解决方案。

【问题讨论】:

    标签: javascript .net node.js hash sha2


    【解决方案1】:

    编辑:您在 C# 中使用 UTF-16,您必须在两种语言中使用相同的编码:

    Node.js:

    var crypto = require("crypto");
    var sha256 = crypto.createHash("sha256");
    sha256.update("ThisPassword", "utf8");//utf8 here
    var result = sha256.digest("base64");
    console.log(result); //d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=
    

    C#:

    SHA256 sha256 = SHA256Managed.Create(); //utf8 here as well
    byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes("ThisPassword"));
    string result = Convert.ToBase64String(bytes);
    Console.WriteLine(result); //d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=
    

    【讨论】:

    • 谢谢,效果很好!当您回答时,我正在添加代码。 :)
    • 好的,所以上面的解决方案改变了 .NET 实现以匹配 JS 的实现(即 UTF-8)。我们有类似的情况,只是我们存储了使用 Unicode 编码 (UTF-16) 计算的哈希值。那么问题来了,我们如何改变 JS 实现来匹配呢?
    • 效果很好!感谢您的帮助!
    【解决方案2】:

    如果您使用来自 System.Web.Security 的 .NET Framework 的内置 SqlMembershipProvider 类,则哈希在生成时包含盐值以及密码材料。简单地在 node.js 中单独对密码进行哈希处理永远不会产生与数据库中的哈希相同的结果。

    请参阅Microsoft ASP.NET 2.0 Providers: Introduction 以获取指向提供程序的 .NET 源代码的链接,该链接可让您了解如何应用 salt 值。

    如果您需要更多帮助,则需要包含您的代码。

    【讨论】:

      【解决方案3】:

      我创建了节点 pbkdf2 模块(来源https://github.com/fundon/pbkdf2

      所需节点 >= 0.11.11

      var pbkdf2 = require('pbkdf2');
      var p = 'password';
      var s = pbkdf2.generateSaltSync(32);
      var pwd = pbkdf2.hashSync(p, s, 1, 20, 'sha256');
      var bool = pbkdf2.compareSync(pwd, p, s, 1, 20, 'sha256');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多