web-dev-qa-db-ja.com

SHA256と.NET / Node.jsを使用したパスワードのハッシュ

.NETによって生成されたデータベースにSHA256ハッシュのユーザーパスワードを保存しているので、Node.jsでそれらを確認できる必要があります。唯一の問題は、.NETとNode.jsが同じパスワードに対して異なるハッシュを作成することです。

Password: ThisPassword  

。ネット:

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 を見つけましたが、彼のソリューションを実装する方法を理解できませんでした。

19
davey555

編集: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=
32
Esailija

System.Web.Securityの.NETFrameworkの組み込みSqlMembershipProviderクラスを使用している場合、ハッシュには、生成時にソルト値とパスワードマテリアルが組み込まれます。 node.jsでパスワードだけをハッシュするだけでは、データベースのハッシュと同じ結果が得られることはありません。

ソルト値がどのように適用されるかを確認できるプロバイダーの.NETソースコードへのリンクについては、 Microsoft ASP.NET 2.0プロバイダー:はじめに を参照してください。

これ以上のヘルプが必要な場合は、コードを含める必要があります。

1
JamieSee

ノード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');
0
fundon