lip*_*ile 1 postgresql security encryption
我正在考虑将 PostgreSQL 用于一个项目,因为它是免费的,人们说它很好,但我需要在我的数据库中进行一些加密。我做了一些搜索,我在 PostgreSQL 中找到了这些选项:
我不知道什么是“最安全”,你们能帮我解决这个问题吗?在这种情况下,我更喜欢稍微慢一点的安全性,而不是速度和一点安全性。
在这种情况下,我猜加密比“只是”散列密码要好,并且在 db 上确实需要它。我需要对我的用户的登录信息进行强加密。难点不是如何存储,而是如何通过加密来保护它。
如果要验证用户的密码,最好使用的算法之一是bcrypt。
我建议您在应用程序层实施加密和验证,这样您就可以减少处理纯文本数据的时间。
但是,如果您正在寻找一种在 PostgreSQL 方面做到这一点的方法,您可以使用pgcrypto
extension。所以你有一些步骤:
连接到您的数据库并创建扩展:
CREATE EXTENSION pgcrypto;
Run Code Online (Sandbox Code Playgroud)您的用户表至少需要以下字段:
CREATE TABLE users(
login text PRIMARY KEY,
passwd text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)当您插入新密码时,您会:
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。
一旦您的用户在那里,要验证其密码,您可以:
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)
归档时间: |
|
查看次数: |
1335 次 |
最近记录: |