2013-07-09 27 views
7

私はdjangoのデータベースを持っており、Node.jsから作業したい私はタスクを持っている:ユーザーを認証する。データベースから知られています:アルゴリズムpbkdf2_sha256、salt、10000反復、base64エンコードされたハッシュ与えられたbase64-hashにいくつかのパスワードをエンコードするために私はJSで何をする必要がありますか?Django pbkdf2_sha256 JSの実装

UPD:ここに解決策を見つけた:python (django) hashlib vs Nodejs cryptoが、ジャンゴ・生成されたハッシュとJS-生成されたハッシュが一致していない...
Djangoは次の生成:

pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo= 

JS:

pbkdf2_sha256$10000$NmzpPCQiTe2R$w4jCgWjDilrDmcOBd8K+I8OdwpkKwoVQZMKWH3FvYcKoAMKcwqlewobDocOEGMKZfQ== 

をパスワード:Simple123

+0

PBKDFから同じバイト数を取得しようとしましたか?あなたがその番号を指定しなかった場合、返された49バイトを取得することは少し奇妙です。また、両方の関数でパスワードの同じ文字エンコーディングを使用していることを確認してください.PBKDF2の文字エンコーディングは指定されていません(UTF-8は暗黙のうちです)。 –

答えて

7

pbkdf2-sha256(あなた自身のリンクから)私はDjangoのものと同じハッシュを生成することができます。

var pbkdf2 = require('pbkdf2-sha256'); 
var validatePassword = function (key, string) { 
    var parts = string.split('$'); 
    var iterations = parts[1]; 
    var salt = parts[2]; 
    return pbkdf2(key, new Buffer(salt), iterations, 32).toString('base64') === parts[3]; 
}; 
var djangoPass = 'pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo='; 
console.log(validatePassword('Simple123', djangoPass)); // Logs: true 

上記のコードは、ノードを使用してDjangoに保存されているパスワードを検証するのに十分なはずです。

0

私はDjangoのpassworに対してユーザーを認証する必要がありますJavaのds。 Djangoのデフォルトのpbkdf2_sha256ハッシャを使ってこの目標を達成しようとして失敗した後、Djangoのパスワードをハッシュする方法を変更して、Javaで同じアルゴリズムを簡単に複製できるようにしました。

Django documentationで説明したようにあなたは、私が最初の位置に、この調理人を置くPASSWORD_HASHERSはsettings.pyで定義される順序を変更することができます。このように

'django.contrib.auth.hashers.SHA1PasswordHasher'

ジャンゴに保存されたパスワードハッシュデータベースには、このようなものです:

sha1$upSZarr0w7CZ$304b22b1a9e7e5387e79f50e691043d3faf83c48

あなたはすでに、彼らが自動的ジャンゴによって変換され、データベースにいくつかのパスワードを使用している場合最初のユーザーログイン。

セパレータとして$を使用すると簡単にトークンをトークン化できます。最初のトークンは常にsha1(使用されるアルゴリズム)であり、2番目のトークンはであり、最後のトークンは実際のハッシュです。我々の場合には

SHA1(upSZarr0w7CZ + password) = 304b22b1a9e7e5387e79f50e691043d3faf83c48

セキュリティ:あなたは

304b22b1a9e7e5387e79f50e691043d3faf83c48

が期待されるパスワードと連結のSHA1の和であることを確認することができますパスワードと一致するように

パスワードハッシングに弱いアルゴリズムを使用することの意義は容認できました。

+0

Djangoのpbkdf2_sha256を実行するJavaの方法については、https://gist.github.com/JustinTArthur/3528cfca7e644547d6ce –

2

私は最近、これを簡単にするためのプロジェクトを作成しました。私のプロジェクトはノード用に利用可能で、node-django-hashersと呼ばれています。コードは以下である:

https://github.com/kalvish21/hashers

使用例:

var hashers = require('node-django-hashers'); 

var h = new hashers.PBKDF2PasswordHasher(); 
var hash1 = h.encode("password", h.salt()); 
console.log(h.verify("password", hash1)); // returns true 
console.log(h.verify("wrong_password", hash1)); // returns false 

これはDjangoのパスワードハッシュと互換性があります。

関連する問題