web-dev-qa-db-ja.com

データベースからパスワードを保存および取得するPythonの最も安全な方法

データベースにユーザー名とパスワードを保存しようとしていて、それを行う最も安全な方法は何なのか疑問に思っています。どこかでソルトを使用する必要があることは知っていますが、ソルトを安全に生成する方法やパスワードを暗号化するために適用する方法はわかりません。いくつかのサンプルPythonコードは大歓迎です。ありがとう。

31
ensnare

Passlibのようなパスワードのハッシュ専用のパッケージを使用するのが最善だと思います: http://packages.python.org/passlib/ ここで説明した理由により: https: //stackoverflow.com/a/10948614/893857

15
M.D.

私はここでこれに答えました: https://stackoverflow.com/a/18488878/1661689 、そして@Koffieもそうでした。

受け入れられた答えが安全でないほど十分に強調する方法がわかりません。プレーンテキストよりも優れており、無塩ハッシュよりも優れていますが、それでも極端に脆弱は辞書攻撃やブルートフォース攻撃に対してもです。代わりにSlow KDFを使用 bcryptのように(または少なくとも10,000回の反復でPBKDF2)

13
Terrel Shumway

アプリケーションの両方のエンドポイントを十分に制御できる場合、絶対的な最良の方法は PAK-Z + を使用することです。

(編集:元のバージョンを推奨 [〜#〜] srp [〜#〜] しかし、PAK-Z +にはセキュリティの証拠があります。)

3
Paul Crowley

8を超える長さのパスワードが問題にならない場合、(effbotから取得した)より簡単な方法を以下に示します。

import crypt

import random, string

def getsalt(chars = string.letters + string.digits):
    # generate a random 2-character 'salt'
    return random.choice(chars) + random.choice(chars)

パスワードを生成するため:

crypt.crypt("password", getsalt())

*:8文字を超える長さのパスワードは、右から8文字まで削除されます

0
llazzaro