12

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

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

しかし、postgresql にはmd5プレフィックスが必要なので、

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

ただし、パスワードとして使用すると認証に失敗psql123します。

を使えばpasslib大丈夫です。http://pythonhosted.org/passlib/lib/passlib.hash.postgres_md5.htmlを参照してください。

psql123パスワードとして次のように使用しても問題ありません。

ALTER USER postgres PASSWORD 'md556074e7318bd4cee558faab0678a2fad';

の警告が何を言いたいのか理解できませんpasslib。このハッシュをpostgresユーザーに使用してもよろしいですか? また、ドキュメントのどこにusername入力の一部である必要があると書かれていますか?

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

4

2 に答える 2

19

Postgresのパスワードハッシュはあなたがしたものに非常に近く、次のようにユーザー名を含める必要があります。

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

AFAIK、postgresのドキュメントは実際にはこのハッシュ形式をまったく文書化しておらず、管理者がこれらのハッシュを直接処理することはめったにないと想定しているようです:(私が知っているこれらのハッシュを生成するための組み込みメソッドはありません。ALTER USERコマンドはpostgresハッシュ形式に準拠しておらず、パスワードがハッシュされていないことを前提としており、CREATE ROLEのENCRYPTEDキーワードのドキュメントに従って、内部で処理します(IMHOこれは欠陥のある動作です。ハッシュはユーザー名によって異なります。つまり、異なるアカウント間でハッシュをコピーして貼り付けることはできず、アカウントの名前が変更されると壊れます。また、(エントロピーを推測すると)有効なソルトは約6ビットしかありません)。

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

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

于 2013-02-18T16:50:28.500 に答える
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;
于 2013-02-17T11:43:28.520 に答える