使用SHA256和.NET/Node.js散列密码

dav*_*555 19 .net javascript hash sha2 node.js

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

Password: ThisPassword  
Run Code Online (Sandbox Code Playgroud)

.净:

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

//Tlwxyd7HIQhXkN6DrWJtmB9Ag2fz84P/QgMtbi9XS6Q=
Run Code Online (Sandbox Code Playgroud)

Node.js(使用加密):

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

//d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=
Run Code Online (Sandbox Code Playgroud)

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

Esa*_*ija 32

编辑:您在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=
Run Code Online (Sandbox Code Playgroud)

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=
Run Code Online (Sandbox Code Playgroud)

  • 好的,所以上面的解决方案更改了 .NET 实现以匹配 JS(即 UTF-8)的实现。我们有类似的情况,只是我们存储了使用 Unicode 编码 (UTF-16) 计算的哈希值。那么问题来了,我们如何改变JS实现来匹配呢? (2认同)