2017-08-31 26 views
0

私はdeviseを使用しないrubyアプリケーションでパスワードを保存して検証し、deviseを使用する将来のアプリケーションと互換性を持たせたいと考えています。デフォルトのパスワードハッシュスキームは何を使用するのですか?このコンポーネントだけを抽出して使用することは可能ですか?どのようなパスワードハッシュアルゴリズムを使用していますか?

答えて

1

DevitsのDatabaseAuthenticatableモジュールは、Devise::EncryptorモジュールでラップされたパスワードをハッシュするためにBCrpytを使用します。関連する方法、digestは、非常に単純です:

def self.digest(klass, password) 
    if klass.pepper.present? 
    password = "#{password}#{klass.pepper}" 
    end 
    ::BCrypt::Password.create(password, cost: klass.stretches).to_s 
end 

klassは、夫婦のみのパラメータをフェッチするために使用されます:pepper、データベースに格納されているパスワードの事前ハッシュが、ないに付加される文字列を(とは異なり、 saltも追加されますが、パスワードはDBに保存されます)。 cost、ハッシュの安全性の基準(the docsを参照)。これらはどちらも静的なものなので、Devise以外のアプリにそれらをハードコードすることができます(ただし、pepperは秘密にしておいてください)。

だから、あなたのハッシュ法は、同じように書かれるかもしれない:唐辛子は、すべてのユーザー間で同じである

def self.digest(password) 
    password = "#{password}#{ENV['PASSWORD_PEPPER']}" 
    ::BCrypt::Password.create(password, cost: 10).to_s 
end 
+0

? – fields

+0

範囲からランダムに割り当ててはいけませんか?パスワードを検証したときにテストされる可能性のある値はどれですか?それはまた塩を使うことができますか? – fields

+0

Pepperはすべてのユーザーで同じですが、データベースには格納されません(つまり、ハッシュには格納されません)。塩はユーザーごとにランダムに生成されます(Bcrpytによって、なぜ上記のことも言及されていません)が、ハッシュと共に格納されます。攻撃者は無差別の攻撃を行うためにデータベースとコードベースの両方が必要になるため、両方の組み合わせでセキュリティが強化されます。 –

関連する問題