2011-03-16 143 views
2

寻求创建一个保存用户信息(主要是用户和密码)的数据库表。在数据库中存储用户密码/数据

  • 散列(密码)和用户的最佳方式是?
  • 我是否应该加密用户的名字?
  • 如果我有一个密码表和另一个用户数据表,我怎么可以关联/链接它们?

登录是没有问题的,问题是如何将表(数据的密码的表和表为每个用户)

由于

+0

我只是散列密码。显然,两者都会更安全,但我相信最好的做法是散列密码。 – 2011-03-16 17:50:41

+0

您还应该为每个密码使用不同的盐。 – John 2011-03-16 17:53:07

+0

@John,如果你对每个密码使用不同的盐,当你需要检查用户密码是否正确时,你会如何使用正确的salt? – 2011-03-16 17:59:23

回答

3

您基本的用户表看起来是这样的:

User Table 
------- 
id username password 
1  mike  @#$90sDfsa 

,其中的密码是我的密码的哈希版本(带salt)。

+0

是的,我同意,问题是关联其他表的数据与麦克 – anvd 2011-03-16 17:59:11

+1

在这种情况下,你会使用一个外键......一个例子可能是:Post(id,title,body,user_id)其中user_id是对用户表中的id的引用。 – 2011-03-16 18:00:20

0

我会存储散列和表中腌制密码与用户数据的其余部分。如果您真的想将密码存储在单独的表中,请将用户标识与其关联以将密码与用户相关联。通常使用强哈希算法,例如SHA251并加密密码以防止彩虹表攻击。我不认为你应该需要散列用户名。

+0

感谢贝林加,我有一个独特的表/传入/登录,问题是表中的关系:用户迈克和在另一个表中存在的关联(个人)数据 – anvd 2011-03-16 18:01:48

+0

*不*使用加密哈希算法!使用bcrypt(http://bcrypt.sourceforge.net/) – 2011-03-16 18:04:10

+0

@Fel,这已经说了几次了,但我们都强烈建议你只需添加UserId,Username和PasswordHash列来扩展用户表。如果你这样做,你的生活将会更容易。这是一个选择吗? – 2011-03-16 18:04:20

0

正如我上面评论,我只是散列密码。

另外,你为什么要在单独的表中存储用户和密码?它们是相关的,应该在同一个表中。诸如地址之类的数据将属于单独的表格。

+0

不,我的想法只是通过/登录和另一个关联的数据,如出生,位置等表 – anvd 2011-03-16 17:57:45

1

在存储密码之前,您当然应该密码。理想的是用独特的盐。

作为一个散列函数,你不应该使用类似SHA- *的东西,因为密码散列函数被设计得很快。这使得获得散列的人很容易以非常快的速度尝试大量可能的密码。

使用密码哈希函数,如bcrypt,它被设计为任意慢。

+0

请提出一个问题,如果我对每个密码都有独特的盐,我有同样的怀疑 - 如果您需要检查用户密码是否正确,您将如何使用正确的盐“ – anvd 2011-03-16 18:10:25

+0

您只需沿着哈希节省盐。 – 2011-03-16 18:17:44

0

如果您绝对必须有两个表,一个使用哈希/盐渍密码,另一个使用用户信息,您可以使用代理键来执行表之间的关系。

你可以有一个设置是这样的:

CREATE TABLE users (USER_ID INTEGER, 
        PASSWORD_ID INTEGER, 
        USER_ATTRIBUTE VARCHAR(30)); 
CREATE TABLE passwords (PASSWORD_ID INTEGER, 
         PASSWORD_HASH VARCHAR(255)); 

PASSWORD_ID是代理键,您可以使用它在用户表中的密码表参考价值。您可以使用SQL查询将表连接在一起:

SELECT * 
FROM users INNER JOIN passwords 
    ON users.PASSWORD_ID = passwords.PASSWORD_ID; 
+0

虽然我不会在任何系统中使用称为“密码”的表,因为它是一个成熟的黑客对象... – 2011-03-16 19:16:59