如何在postgres中使用pgcrypto来哈希密码

时间:2013-12-22 17:30:44

标签: php mysql postgresql hash pdo

我通常使用sha1散列密码+ salt,并将密码hash和salt插入MySQL数据库。现在我必须在新项目(PHP项目)中使用postgres并且我知道,有更好的方法来加密密码。我找到了这个pgcrypto和代码:

  UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));
SELECT pswhash = crypt('entered password', pswhash) FROM ... ;

但我完全不了解这种方式。你能解释一下我在数据库中需要具备的内容以及如何获取这些值吗?我使用PDO。

1 个答案:

答案 0 :(得分:1)

Postgres'crypt()类似于PHP的crypt()和(如果我正确阅读文档)与PHP5.5的密码扩展相同,当使用河豚盐(你应该使用它)时:

算法背后的基本思想是为每个密码提供一个唯一的salt,并将此唯一salt存储为哈希密码的一部分。这允许使用散列密码对密码进行散列,如下所示:

denis=# select gen_salt('bf');
           gen_salt            
-------------------------------
 $2a$06$DOCbBUPOHRoXVQ9S0IKle.
(1 row)

denis=# select crypt('test', '$2a$06$DOCbBUPOHRoXVQ9S0IKle.');
                            crypt                             
--------------------------------------------------------------
 $2a$06$DOCbBUPOHRoXVQ9S0IKle.atXit.S89NpRb6J6S9S7xfNeZx7Md4e
(1 row)

denis=# select crypt('test', '$2a$06$DOCbBUPOHRoXVQ9S0IKle.atXit.S89NpRb6J6S9S7xfNeZx7Md4e');
                            crypt                             
--------------------------------------------------------------
 $2a$06$DOCbBUPOHRoXVQ9S0IKle.atXit.S89NpRb6J6S9S7xfNeZx7Md4e
(1 row)

顺便说一句,您可能希望使用PHP 5.5的password_hash()直接散列数据,以避免在PHP和数据库之间不必要地加载未散列的密码。假设你这样做,使用Postgres'crypt()作为一个方便兼容的实用程序,如果您需要使用未加密的密码导入行而不诉诸php。