1

Python の crypt パッケージを使用して、Django Web サイトの MySQL データベースに暗号化されたパスワードを保持しています。これがバグかどうかはわかりませんが、使用しているコードは次のとおりです。

パスワードを暗号化/保持するには:

user.password = crypt(request.POST['password'], netid)
user.save()

ログイン時に正しいパスワードを確認するには:

if crypt(password, email) == user.password:
# Grant acccess to the user's profile, etc.

問題は次のとおりです。netid = test@example.com変数とでパスワードを暗号化すると、正常に機能しますrequest.POST['password'] = 'ABC123abc'。ただし、ログインしようとするときに password を使用すると'ABC123abc[trailing_chars]'、trailing_chars は任意の有効な文字列にすることができますが、ログインできます。これはなぜですか? このままでは大きなセキュリティ ホールになりそうです。

4

1 に答える 1

6

まず第一に、電子メール アドレスを crypt のソルト (2 番目の引数) として使用しないでください。これは安全ではありません。適切なランダム ソルトを選択する必要があります。

従来のクリプトの場合、salt はセットから選択された 2 文字の文字列[a–zA–Z0–9./]です。このバージョンの crypt は、8 つの入力文字のみを受け入れ、8 番目以降の入力から後続のすべての文字を破棄します。それがあなたがここで見ているものです。

最新の暗号化実装は、従来の暗号化よりも暗号学的にはるかに強力な他のアルゴリズムもサポートしていますが、すべてのプラットフォームで利用できるわけではありません。また、新しいアルゴリズムでは、入力が 8 文字に制限されていません。

これらのより優れたアルゴリズムのいずれかを使用するには (それらをサポートするプラットフォームを使用している場合)、特別な形式のソルトを提供する必要があります。これは、代替アルゴリズムを使用したいことを関数が認識する方法です。

glibc でサポートされている (したがって GNU/Linux で利用できる) 追加のアルゴリズムについては、crypt manpageの「Glibc Notes」セクションを参照してください。

ちなみに、パスワードを確認するときは、salt を手動で抽出する必要はありません。暗号化されたパスワードは既にソルトで始まっているため、2 番目の引数としてuser.password(not ) を に渡します。これは、古いアルゴリズムを使用している場合でも、新しいアルゴリズムを使用している場合でも機能します。アルゴリズムの選択と正しい形式でのソルトの生成は、パスワードを検証するときではなく、パスワードを暗号化するときにのみ行う必要があります。emailcrypt

于 2013-01-11T18:43:10.520 に答える