web-dev-qa-db-ja.com

塩生成とオープンソースソフトウェア

私が理解しているように、塩を生成するためのベストプラクティスは、ソースコードに格納された暗号式(または魔法の定数)を使用することです。

私はオープンソースとしてリリースする予定のプロジェクトに取り組んでいますが、問題はソースにソルトを生成するための秘密の式が付属しているため、サイトでレインボーテーブル攻撃を実行できることです。

多くの人々が私の前にこの問題を考えていたと思います、そして、私はベストプラクティスが何であるかと思っています。コードがオープンソースの場合、ソルトは簡単にリバースエンジニアリングできるため、ソルトを使用しても意味がありません。

考え?

70
user199085

実際には、塩は各エントリに対して一意である必要があります。たとえ攻撃者が塩が何であるかを計算できたとしても、レインボーテーブルを作成することは非常に難しくなります。これは、ハッシュされる前にソルトがパスワードに追加されるため、パスワードフィールドのすべての可能な値のリストを持つためにRainbowテーブルに含まれる必要があるエントリの総数に効果的に追加されるためです。

18
kemiller2002

Unixが普及して以来、パスワードを保存する正しい方法は、ランダムな値(ソルト)を追加してハッシュ化することでした。塩は後で手に入れることができますが、悪者が手に入れられないことを望む場所では塩を保存してください。

これにはいくつかの良い効果があります。まず、悪者は「Password1」のような予想されるパスワードのリストを作成し、それらをRainbowテーブルにハッシュし、パスワードファイルを調べて一致するものを探すことができません。優れた2バイトのソルトがある場合、予想されるパスワードごとに65,536個の値を生成する必要があるため、Rainbowテーブルの実用性は大幅に低下します。第二に、パスワードファイルを見ている悪人からの塩を保つことができれば、可能な値を計算することをずっと難しくしました。第三に、特定の人物が異なるサイトで同じパスワードを使用しているかどうかを悪者が判断できないようにしました。

これを行うには、ランダムなソルトを生成します。これにより、希望する範囲内のすべての数値が一定の確率で生成されます。これは難しくありません。単純な線形合同乱数ジェネレーターがうまく機能します。

あなたが塩を作るために複雑な計算をしているなら、あなたはそれを間違っています。パスワードに基づいて計算する場合、それは間違っています。その場合、あなたがしているのはハッシュを複雑にすることであり、機能的にソルトを追加することではありません。

セキュリティが得意な人は、アルゴリズムの隠蔽に依存しません。現代の暗号化は広範囲にテストされたアルゴリズムに基づいており、広範囲にテストされるためにはそれらはよく知られている必要があります。一般的に、標準のアルゴリズムを使用する方が、自分で転がしてそれが良いことを期待するよりも安全であることがわかっています。コードがオープンソースであるかどうかは関係ありませんが、悪人がプログラムの動作を分析することは依然として可能です。

7
David Thornley

実行時に各レコードに対してランダムなソルトを生成できます。たとえば、ハッシュ化されたユーザーパスワードをデータベースに保存するとします。実行時に小文字および大文字の英数字の8文字のランダムな文字列を生成し、それをパスワードの先頭に追加し、ハッシュthat文字列を作成して、データベースに保存できます。 62があるので8 (可能性のあるすべての塩について)Rainbowテーブルを生成する可能性のある塩は、法外に高価になります。また、各パスワードレコードに一意のソルトを使用しているため、攻撃者が一致するRainbowテーブルをいくつか生成した場合でも、攻撃者はevery passwordを解読できません。

セキュリティのニーズに基づいて、ソルト生成のパラメーターを変更できます。たとえば、より長いソルトを使用したり、句読点も含むランダムな文字列を生成して、可能なソルトの数を増やしたりすることができます。

1
mipadi

データを暗号化してリモートサーバーに送信するデスクトップアプリケーションの場合、毎回異なるソルトの使用をどのように検討しますか?

ユーザーのパスワードでPKCS#5を使用すると、データを暗号化するために、暗号化キーを生成するソルトが必要です。デスクトップアプリケーションでソルトをハードコード化(難読化)しておくのは良い考えではないことを知っています。

リモートサーバーがユーザーのパスワードを決して知る必要がない場合、毎回異なるソルトを使用することは可能ですか?ユーザーが別のコンピューターでデスクトップアプリケーションを使用している場合、キーがない場合(ソフトウェアにハードコーディングされていない場合)、リモートサーバー上のデータをどのように解読できますか?

0
Normand Bedard

ランダム関数ジェネレーターを使用してソルトを生成し、データベースに保存し、行ごとにソルトを1つ作成し、データベースに保存します。

Django登録で塩が生成されるのが好きです。リファレンス: http://bitbucket.org/ubernostrum/Django-registration/src/tip/registration/models.py#cl-85

salt = sha_constructor(str(random.random())).hexdigest()[:5]
activation_key = sha_constructor(salt+user.username).hexdigest()
return self.create(user=user,
           activation_key=activation_key)

彼は、乱数とユーザー名によって生成されたshaの組み合わせを使用してハッシュを生成します。

Sha自体は、強力で壊れにくいことで有名です。複数のディメンションを追加して、ソルト自体を生成し、乱数、sha、およびユーザー固有のコンポーネントを使用します壊れないセキュリティがあります!

0
Lakshman Prasad