crypt()
およびgen_salt()
関数は特にパスワードのハッシュ化のために設計されたものです。 crypt()
がハッシュ処理を行い、gen_salt()
はハッシュ処理用のアルゴリズム上のパラメータを準備します。
crypt()
アルゴリズムは、以下の点でMD5やSHA1のような通常のハッシュ処理アルゴリズムと異なります。
1. 低速です。 データ量が少ないためパスワード総当たり攻撃に対して頑健にする唯一の方法です。
2. 結果にはソルトというランダムな値が含まれます。 このため同じパスワードのユーザでも異なった暗号化パスワードを持ちます。 これはアルゴリズムの逆処理に対する追加の防御です。
3. 結果内にアルゴリズムの種類が含まれます。 このため異なるアルゴリズムでハッシュ化したパスワードが混在可能です。
4. 一部は適合型です。 つまり、コンピュータが高速になったとしても、既存のパスワードとの互換性を損なうことなくアルゴリズムを低速に調整することができます。
アルゴリズム | パスワード最大長 | 適合型かどうか | ソルトビット長 | 説明 |
bf | 72 | はい | 128 | Blowfishベース、2a版 |
md5 | 無制限 | いいえ | 48 | MD5ベースの暗号 |
xdes | 8 | はい | 24 | 拡張DES |
des | 8 | いいえ | 12 | 元来のUNIX crypt |
F.23.2.1. crypt()
crypt(password text, salt text) returns text
passwordのcrypt(3)形式のハッシュを計算します。 新しいパスワードを保管する時には、gen_salt()
を使用して新しいsaltを生成する必要があります。 パスワードを検査する時、既存のハッシュ値をsaltとして渡し、結果が格納された値と一致するかどうかを確認します。
新しいパスワードの設定例を以下に示します。
UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));
認証の例です。
SELECT pswhash = crypt('entered password', pswhash) FROM ... ;
入力パスワードが正しければtrueを返します。
F.23.2.2. gen_salt()
gen_salt(type text [, iter_count integer ]) returns text
crypt()
で使用するランダムなソルト文字列を新規に生成します。 また、このソルト文字列はcrypt()
にどのアルゴリズムを使用するかを通知します。
typeパラメータはハッシュ化アルゴリズムを指定します。 受付可能な種類は、des、xdes、md5、bfです。
繰り返し回数を持つアルゴリズムでは、ユーザはiter_countパラメータを使用して繰り返し回数を指定できます。 指定する回数を高くすれば、パスワードのハッシュ化にかかる時間が長くなり、それを破るための時間も長くなります。 しかし、あまりに多くの回数を指定すると、ハッシュ計算にかかる時間は数年に渡ってしまう可能性があります。 これは実用的ではありません。 iter_countパラメータを省略した場合、デフォルトの繰り返し回数が使用されます。 iter_countで受け付けられる値はアルゴリズムに依存し、表F-19に示す通りです。
アルゴリズム | デフォルト | 最小 | 最大 |
xdes | 725 | 1 | 16777215 |
bf | 6 | 4 | 31 |
xdesの場合、回数が奇数でなければならないという追加の制限があります。
適切な繰り返し回数を選択するために、元々のDES暗号は当時のハードウェアで1秒あたり4個のハッシュを持つことができるように設計されたことを考えてください。 1秒4ハッシュより遅いと、おそらく使い勝手が悪いでしょう。 1秒100ハッシュより速いというのは、十中八九、あまりにも速すぎるでしょう。
ハッシュ化アルゴリズム別に相対的な速度に関する概要を表F-20にまとめました。 この表は、8文字のパスワード内のすべての文字の組合せを取るためにかかる時間を示します。 また、すべて小文字の英字のみのパスワードである場合と大文字小文字が混在した英字と数字のパスワードの場合を仮定します。 crypt-bfの項では、スラッシュの後の数値はgen_salt
のiter_countです。
アルゴリズム | 1秒当たりのハッシュ数 | [a-z]の場合 | [A-Za-z0-9]の場合 |
crypt-bf/8 | 28 | 246年 | 251322年 |
crypt-bf/7 | 57 | 121年 | 123457年 |
crypt-bf/6 | 112 | 62年 | 62831年 |
crypt-bf/5 | 211 | 33年 | 33351年 |
crypt-md5 | 2681 | 2.6年 | 2625年 |
crypt-des | 362837 | 7日 | 19年 |
sha1 | 590223 | 4日 | 12年 |
md5 | 2345086 | 1日 | 3年 |
注意:
· Pentium 4 1.5GHzのマシンを使用しました。
· crypt-desおよびcrypt-md5アルゴリズムの数値はJohn the Ripper v1.6.38の-test出力から得たものです。
· md5の数値はmdcrack 1.2のものです。
· sha1の数値はlcrack-20031130-betaのものです。
· crypt-bfの数は、1000個の8文字パスワードをループする単純なプログラムを使用して得たものです。 こうして、異なる回数の速度を示すことができました。 参考までに、john -testはcrypt-bf/5で213 loops/secでした。 (結果の差異が非常に小さいことは、pgcryptoにおけるcrypt-bf実装がJohn the Ripper(訳注:パスワード解析ツール)で使用されるものと同じであるという事実と一致します。)
"すべての組み合わせを試行する"ことは現実的行使ではありません。 通常パスワード推定は、普通の単語とその変形の両方を含む辞書を使用して行われます。 ですので、いささかなりとも言葉に似たパスワードは上で示した数値よりも速く推定されます。 また6文字の単語に似ていないパスワードは推定を免れるかもしれませんし、免れないかもしれません
0 件のコメント:
コメントを投稿