web-dev-qa-db-ja.com

PostgreSQLでパスワードを暗号化するにはどうすればよいですか?

パスワードのエンコードに問題があります。どうすればよいですか。エンコードの種類md5

digest(data text, type text) returns bytea;
CREATE OR REPLACE FUNCTION md(bytea) returns text AS $$
    SELECT encode(digest($1, 'sha1'), 'md5')
$$ LANGUAGE SQL STRICT IMMUTABLE;

INSERT INTO "login"(login, password, employee_id)
VALUES ( 'email',crypt('password', md('md5')), 1);

**​​エラー**​​*

ERROR: syntax error at or near "digest"
SQL state: 42601
Character: 1
13
Karen Manukyan

digest(data text, type text) returns bytea;は無効な構文です。

代わりにbcryptを使用することをお勧めします。追加の関数定義は必要ありません。

INSERT into "login" (login, password, employee_id) 
     VALUES ('email',crypt('password', gen_salt('bf'));

後で...

UPDATE table SET password = crypt('password',gen_salt('bf'))

そしてパスワードをチェックする:

SELECT ... FROM table 
    WHERE password is NOT NULL 
      AND password = crypt('password-to-test',password);

Bcryptは Crafted Software および Jeff Atwood で推奨されています。 公式のpgcrypto docs も興味深いかもしれません。

36
Mark Stosberg

私はこの質問が古いことを知っていますが、同じ問題を抱えている人のためのものです。

ステップ1:まず、prcryptoがインストールされているかどうかを確認します

_select e.extname, n.nspname from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
_

ステップ2:インストールされていない場合は、拡張機能を作成します

_CREATE EXTENSION IF NOT EXISTS pgcrypto;_

ステップ3:指定されたデータのバイナリハッシュを計算します。

_    CREATE OR REPLACE FUNCTION sha1(bytea) returns text AS $$
      SELECT encode(digest($1, 'sha1'), 'hex')
    $$ LANGUAGE SQL STRICT IMMUTABLE;
_

最終ステップ:

ダイジェストを16進数の文字列にしたい場合は、エンコード機能も使用します

SELECT encode(digest('blue', 'sha1'), 'hex');

または

直接sha('blue')

3
Piyush Sharma