2013-02-17 8 views
11

postgresのパスワードを生成しようとしましたが、hashlibをPythonから使用しました。postgresqlユーザパスワードを生成する

>>> import hashlib 
>>> hashlib.md5("psql123").hexdigest() 
2636d1ddc54901f98d011ffe050c0eb7 

しかし、PostgreSQLは、私がパスワードとしてpsql123を使用する場合は、認証は失敗するので、その後

sudo -u postgres psql 
ALTER USER postgres PASSWORD 'md52636d1ddc54901f98d011ffe050c0eb7'; 

md5接頭辞が必要です。

私がpasslibを使用した場合、私は問題ありません。 http://pythonhosted.org/passlib/lib/passlib.hash.postgres_md5.html

psql123をパスワードとして使用するのは大丈夫です。

ALTER USER postgres PASSWORD 'md556074e7318bd4cee558faab0678a2fad'; 

私はpasslibの警告を理解していません。 postgresユーザーにこのハッシュを使用してもよろしいですか?また、文書のどこにusernameが入力の一部でなければならないのですか?

postgreshashlibの結果を理解できないと考えています。 LDAPユーザーとして、シェルでパスワードを生成できます。 postgresには組み込みのコマンドがありますか? psycopg2にはそれがありますか?それはそうではないように見えます。

答えて

16

Postgresのパスワードハッシュはそれだけで次のように含まれるユーザ名を必要とし、あなたが何をしたかに非常に近いです。

pghash = "md5" + hashlib.md5(password + username).hexdigest() 

AFAIK、postgresのドキュメントは実際にはこのハッシュフォーマットを全く文書化していないので、管理者はこれらのハッシュを直接処理することはめったにありません。私が知っているこれらのハッシュに気をつけてください。 ALTER USERコマンドに提供されたパスワードがpostgresハッシュ形式に準拠していない場合、パスワードはハッシュされていないとみなされ、CREATE ROLEのENCRYPTEDキーワードのドキュメントに従って内部的に処理されます。 (ハッシュがユーザ名に依存すると、異なるアカウント間でハッシュをコピー&ペーストすることができず、アカウントの名前が変更されたときに破損し、エントロピーを推測すると6ビットしかないので、これは間違いです。有効塩)。

ハッシュについてのpasslibのドキュメントの先頭にある警告がおそらくもっと明確になる可能性があります。 passlibのドキュメントを閲覧している人々に、1)このハッシュが恐ろしく不安定であること、2)自分のアプリケーションで使用するためにそれを採用すべきでないこと、3) postgresユーザアカウントは、それが自分のアカウントのためにサポートする最も強力な(そして唯一の)ハッシュフォーマットです。

(自分のアプリケーションのユーザーアカウントにパスワードをハッシュするためにpostgresを使用しようとしている場合は、pgcrypto拡張機能を使用してbcryptを使用することを強く推奨します)。

+0

ありがとう。私はあなたの両方をアップアップしますが、あなたが私の懸念にすべて答えたので、私はあなたにチェックをします。しかし、私はあなたの両方に感謝します。いいえ、ハッシュは 'postgres'ユーザアカウント用であり、appユーザアカウント用ではありません。この種のハッシュは、拡張/長さの攻撃につながる2つの素朴なMAC構造を思い起こさせます。 – CppLearner

5
alter user postgres ENCRYPTED password 'psql123'; 

その他の用途ではpgcryptoモジュールを使用してください。

create table "user" (name text, password_hash text); 

insert into "user" (name, password_hash) values 
('u1', crypt('psql123', gen_salt('bf'))); 

select * from "user"; 
name |      password_hash       
------+-------------------------------------------------------------- 
u1 | $2a$06$SeH4u4aRtT2Zr39er4eSiONT/0IBQHYMbQXn2RauPJKCYdNX1.58G 

select name, password_hash = crypt('psql123', password_hash) 
from "user" 
; 
name | ?column? 
------+---------- 
u1 | t 

は、ターゲット・データベースにログインし、スーパーユーザーとして、それをインストールします。

create extension pgcrypto; 
+0

ありがとうございました!私は後でpgcryptoをチェックアウトします。非常に有用な情報。 – CppLearner

+0

これはちょうどチャームで動作します。これ以上はできません。 – tsohr

関連する問題