0

私のUbuntuソルトでクリプトを機能させるのに問題があります。任意のソルトで実行できますが、特別なソルトでは実行できません。どんな助けでも大歓迎です。

これは機能します:

   cryptWord = crypt.crypt('word', "HX")
   print cryptWord
   #prints salted word

これはしません:

   zebra = crypt.crypt('password', "$1\$WDvKY5n\$")
   print zebra
   # prints None

ソルトされた単語を予定されたパスワードと比較できるようにしようとしていますが、より高度なソルトでは比較できません。何か案は?

4

1 に答える 1

3

これは無効なソルトです。

ドキュメントにはそうは書かれていませんが、ソースは、基になる C 関数が NULLcrypt.cryptを返す場合に が戻ることを明確にしています。POSIXではこれが許可されており、linux/glibcでは無効なソルトが指定された場合に明示的に許可されています。None

では、この塩の何が問題なのですか?

マンページの「Glibc ノート」セクションを読むと、文字列が暗号化メソッド ID として$1\$WDvKY5n\$使用されます。1\id の暗号化方法はありますが、 id の暗号化方法はあり1ません1\。さらに、salt 自体は ですWDvKY5n\が、salt には set 内の文字のみを含めることができます[a-zA-Z0-9/]

ほとんどの場合、文字がエスケープされる何らかの方法でソルトを出力し$(シェルの場合?)、実際の文字列の代わりにエスケープされたバージョンをコピーして貼り付けました。

それがうまくいかなかった場合は、使用するだけ$1$WDvKY5n$ですべて問題ありません。

他の何かがうまくいかず、ソルトが不可逆的に文字化けしている場合は、正しく調べて、見つけたものを使用してください。

一方、これが他のプラットフォーム (の'$1d2n7Q0.r54s'代わりに返さNoneれる) のユーザーに対して機能する理由は、BSD と FreeSec crypt(Linux 以外のほとんどの POSIX プラットフォームのストック実装) の両方が、アンダースコアで始まらないソルトを従来の暗号として使用するためです。最初の 2 文字は任意の ASCII 値にすることができ、残りのソルトは単なるパディングです。

于 2013-10-02T18:03:49.173 に答える