PostgreSQL 中的密码学

lip*_*ile 1 postgresql security encryption

我正在考虑将 PostgreSQL 用于一个项目,因为它是免费的,人们说它很好,但我需要在我的数据库中进行一些加密。我做了一些搜索,我在 PostgreSQL 中找到了这些选项:

  • 男朋友
  • MD5
  • xdes

我不知道什么是“最安全”,你们能帮我解决这个问题吗?在这种情况下,我更喜欢稍微慢一点的安全性,而不是速度和一点安全性。

在这种情况下,我猜加密比“只是”散列密码要好,并且在 db 上确实需要它。我需要对我的用户的登录信息进行加密。难点不是如何存储,而是如何通过加密来保护它。

Mat*_*sOl 7

如果要验证用户的密码,最好使用的算法之一是bcrypt

我建议您在应用程序层实施加密和验证,这样您就可以减少处理纯文本数据的时间。

但是,如果您正在寻找一种在 PostgreSQL 方面做到这一点的方法,您可以使用pgcryptoextension。所以你有一些步骤:

  1. 在您的系统上安装 contribs 包(如果尚未安装)。
  2. 连接到您的数据库并创建扩展:

    CREATE EXTENSION pgcrypto;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您的用户表至少需要以下字段:

    CREATE TABLE users(
        login text PRIMARY KEY,
        passwd text NOT NULL
    );
    
    Run Code Online (Sandbox Code Playgroud)
  4. 当您插入新密码时,您会:

    INSERT INTO users(login, passwd)
    VALUES('my_login', crypt('my_password', gen_salt('bf')));
    
    Run Code Online (Sandbox Code Playgroud)

    'my_login'用户的登录名(电子邮件、用户名等)和'my_password'普通用户密码。以及'bf'您正在使用的加密算法,即“bf”bcrypt。

  5. 一旦您的用户在那里,要验证其密码,您可以:

    SELECT count(*) AS match
    FROM users u
    WHERE
            u.login = 'my_login'
            AND u.passwd = crypt('my_password', u.passwd);
    
    Run Code Online (Sandbox Code Playgroud)

    如果上面的查询返回1,则登录成功(login和passwd匹配),如果返回0,则登录失败(login或passwd不匹配)。

但同样,我仍然建议您在应用程序中使用相同的过程,因为这样您就不需要将普通密码发送到数据库,并尽快使用加密密码。在应用程序上做的想法是您的查询返回加密的密码,您只需在应用程序端对其进行验证,例如(基于 Python 的示例):

import bcrypt
import psycopg2

def validate_login(user_login, user_passwd):
    con = psycopg2.connect('<your connection string>')
    cur = con.cursor()
    cur.execute("SELECT passwd FROM users WHERE login = %s", (user_login,))
    db_passwd = cur.fetchone()
    cur.close()
    con.close()

    if db_passwd == None:
        return false # login not found
    else:
        if bcrypt.hashpw(user_passwd, db_passwd[0]) == db_passwd[0]:
            return true # login successfully
        else:
            return false # login exists but passwd is incorrect
Run Code Online (Sandbox Code Playgroud)