2011-12-28 51 views
0

PostgreSQL只有MD5加密存储密码。,保存密码的最佳方法是什么?

从阅读黑客日志,似乎MD5本身并不是一个非常安全的方式来存储密码。

我一直在客户端使用MD5 — MD5的MD5,然后再次在数据库—处使用MD5,但我不知道这是更强大的。

首先,是否需要加强存储密码?第二,什么是简单,有效的跨语言方法?

+0

选民结束:你会介意解释你的推理吗? – 2011-12-28 09:02:56

+0

对存储过程的广泛使用,因此在移植到应用程序级别之前,传统上都会在db级别测试所有内容。也许你是对的 - 也许我的方法已经让我对盲目失明了。 – 2011-12-28 09:09:39

+0

当然,你也可以使用'pgcrypto':http://www.postgresql.org/docs/8.3/static/pgcrypto.html ...但如果是我,我只会在应用程序级别执行它:) – 2011-12-28 09:17:38

回答

8

安装pgcrypto扩展给你一套功能和使用的工具。 其中有能力使用bcrypt,这是存储密码的好方法。

如果不在postgres中使用它,你可能会认为它在你使用的语言之外。

相关链接:http://www.postgresql.org/docs/current/static/pgcrypto.html为postgres部分和http://codahale.com/how-to-safely-store-a-password/为动机/解释为什么你想要使用它。

+0

伟大的链接!谢谢! – 2011-12-28 09:32:42

+1

啊,是的 - 很显然,早起并没有帮助我记忆。当用于密码验证时,bcrypt肯定比sha256更好(而且scrypt会更好......) – 2011-12-28 09:50:17

2

没有必要在数据库中做散列。只要你基础的盐对像可以在不访问哈希密码确定用户名,它只是作为安全到了在应用层面:

password_hash = sha256(user_name + password) 
user_id = query("SELECT id FROM user WHERE name=? and password_hash=?", 
       user_name, password_hash).first() 

或者你可以检查两个用户名和密码分开的步骤,并使用用户ID作为盐:

user_id, password_hash = query("SELECT id, password_hash FROM user WHERE name=?", 
           user_name).first() 
if password_hash != sha256(user_id + password): 
    raise Exception("authentication failed") 
+0

user_name是易失性的 - 会对usr_id工作产生影响吗? – 2011-12-28 09:10:49

+0

当然,这也可以工作:'user_id,password_hash = query(“SELECT id,password_hash FROM user WHERE name =?”,user_name);如果password_hash!= sha256(user_id +密码):引发异常(“验证失败”)' – 2011-12-28 09:15:33

相关问题