2008-08-27 10 views
15

データベースのパスワードを保護するための良い、簡単な暗号化方式とは何ですか?私はハイパーセキュアなものも必要もないし、速くて忙しいものは何も必要ないが、そのようなことはすばらしいだろう。主に、私はちょうど非常に遅くて、あるいは安全でなくても実装が簡単なものを求めています。単純なパスワードの暗号化

答えて

13

mkによれば、SHA1またはMD5はSHA2とともに標準のものです。

より一般的には、暗号ハッシュ関数と呼ばれます。暗号化ハッシュは一方向に設計されています(生成されたハッシュが与えられているため、元の入力を派生させることはできません)。また、同じハッシュ(ハッシュ衝突とも呼ばれる)を持つ2つの任意の文字列の可能性は低い(理想的には1 /ハッシュ値の数)べきである。

あなたのパスワードがハッシュされているという理由だけで、ハッシュバージョンを安全に保つために本当に大変努力する必要がなくなりません。あまりにも多くの人がオフラインのブルートフォース攻撃に対して脆弱な弱いパスワードを使用します。

編集 - 複数の人々が既に塩を使用することの重要性を指摘しています。塩は、ハッシュ関数を使用する前に入力と混合する定数値です。独自のソルトを持つことで、オフラインの攻撃者は、事前計算済みの共通パスワード(虹テーブル)のテーブルを使用してパスワードをより迅速に強制できなくなります。

+2

OPの場合:MD5やSHA1/2などの一方向ハッシュを使用している場合、その「復号化」はできません。つまり、元の平文パスワードをハッシュ文字列から復元することはできません。ユーザーがログインしたときにパスワードをテストするには、入力されたパスワードに同じハッシュを適用し、2つのハッシュを比較します。 –

2

SHA片方向ハッシュアルゴリズムと固有の塩を使用してください。それは私のパスワードをデータベースに保存するために使う主なアルゴリズムです。

9

MD5またはSHA1を使用する場合は、レインボーテーブルのハッキングを避けるために塩を使用してください。

は、C#では、これは簡単です:

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider(); 
string addSalt = string.Concat("ummm salty ", password); 
byte[] hash = hasher.ComputeHash(Encoding.Unicode.GetBytes(addSalt)); 
0

私は塩でMD5またはSHAに投票しています。主要なWeb開発言語には、ハッシュを計算するための関数が組み込まれています(PHPでは、たとえば、mcryptパッケージに必要な関数が含まれています)。

+0

なぜ人々は、ランダムに周りに行くと、完全に合法的な答えをdownvoteていますか? –

0

上記で提案したSHA-1のような単方向ハッシュアルゴリズムをソルトで使用する必要があります。私は詳細については、このサイトをお勧めします。いくつかのサンプルコード/実装が含まれています。 http://www.obviex.com/samples/hash.aspx

0

セキュリティを強化する鍵は、ダイナミック塩を使用することです。つまり、新しいユーザーごとにランダムな文字列を生成し、その文字列を使用してハッシュをソルトします。もちろん、後でパスワードを確認できるようにするには、この塩をデータベースに保存する必要があります(私は暗号化しません)。

3

これは数週間前の私の問題でした。 大規模なMISプロジェクトを、975の異なる地理的な場所に展開していました。ここでは、独自のユーザー資格情報ストアが、すでに実装されているさまざまなアプリケーションの使用のための認証者として使用されます。すでにRESTとSOAPベースの認証サービスを提供していましたが、顧客は関連するテーブルやビューの読み取り専用ビューにDB接続するだけで、他のアプリケーションからユーザーの資格情報ストアにアクセスできるようにしなければなりませんでした。一口... (この非常に結合した悪いデザインの決定は別の質問の対象です)。

私たちは、塩漬けで反復的にハッシュされたパスワード記憶方式を仕様に変換し、いくつかの異なる言語実装を提供して簡単に統合できるようにしました。

「Fairly Secure Hashed Passwords」または簡潔にFSHPと呼ばれています。 Python、Ruby、PHP5で実装し、パブリックドメインにリリースしました。 GitHubで消費、フォーク、火炎または唾液の採取が可能http://github.com/bdd/fshp

FSHPは、塩漬けで反復的にハッシュ化されたパスワードハッシングの実装です。

設計原理は、RFCでPBKDF1仕様2898 と同様です(:PKCS#5:別名。パスワードベースの暗号化仕様バージョン2.0) FSHPは、反復回数と 基本となる暗号ハッシュを塩の長さを選択することができますSHA-1とSHA-2(256,384,512)の間の機能です。 すべての出力の冒頭にあるメタ定義の自己定義でポータブルになり、消費者は独自のパスワードストレージセキュリティベースラインを選択できます。

SECURITY

デフォルトFSHP1はSHA-256ハッシュの4096回の反復と、8つのバイトの塩を使用します。 - 8バイトのsaltは、 に必要なスペースに2^64を掛けて、虹のテーブル攻撃を非実用的にします。 - 反復回数が4096であるため、ブルートフォース攻撃がかなり高価になります。 - このリリースの時点でより少ない2^128の操作の計算量との衝突を見つけるためにSHA-256に対する既知の攻撃はありません。

実装:

  • パイソン:2.3.5 2.5.1、(hashlib/W)でテストされ、2.6.1
  • ルビー:1.8.6
  • PHP5でテスト:テストさ5.2.6

すべての人は、欠けている言語の実装を作成することを歓迎するだけでなく、 は現在のものを磨くだけです。

基本動作(パイソン付き) CRYPTをカスタマイズ

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt') 
>>> print fsh 
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g== 
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh) 
True 

私たちのパスワードのハッシュ方式を弱めてみましょう。 - 2 にデフォルト8からの塩の長さを短く - デフォルト4096から10 に反復ラウンドを減らし - 基本となるハッシュアルゴリズムとしてSHA-1を用いてFSHP0を選択します。

>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0) 
>>> print fsh 
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ== 
0

非可逆暗号化の場合、私はもっとも間違いなくSHA256またはSHA1を使用します。 MD5には現在多くの衝突があり、多くの努力がそれを打ち破っているので、使い方は良くありません。

0

ソリューションを将来的に証明したい場合は、SHA256またはSHA512をお勧めします。暗号化されたgeekworldは、MD5について、少し程度は低いが、SHA1に関して不安を感じている。

または、あなたは、私が特にstackoverflowの上、適切にハッシュ化パスワードを行う方法について多くの混乱を気づいたSHA-3

0

を待つことができるかどうか。だから私はすべてをクリアするはずのページを書いた。シンプルなハッシュを使うよりももう少しです。

さらに詳しい情報:How to do password hashing properly

+2

ちょっと手を加えて*答えを編集できますか?これはあなたのページに恥知らずなプラグ(* spam *)のように感じるでしょう。あなたのページには良い情報が含まれているようです。 – jschmier

関連する問題