您会使用一个或两个表作为用户名和密码吗?

时间:2010-04-28 07:33:08

标签: sql mysql security database-design

创建一个包含用户信息的表和另一个用于密码的表是否比使用相同的表更安全?

8 个答案:

答案 0 :(得分:8)

不,我会这样做:

id,username,password。

其中id只是自动增量,username是varchar 20(左右,具体取决于你的需要),password是带有salt的MD5或SHA1哈希密码。

为此使用两个表是没有意义的。然后,您需要使用联接来获取数据。这只是一种不必要的负担。

答案 1 :(得分:6)

不,我看不出它如何能让它更安全。

实际上你应该避免存储密码。只需存储他们的咸味哈希。

进一步阅读:

答案 2 :(得分:1)

我不同意其他人 - 将身份验证信息放在一个单独的表中,并尽可能完全从您的应用程序中提取身份验证。你不应该在乎。想想siteminder之类的东西 - 您的Web应用程序没有关于用户如何进行身份验证的任何信息。密码,智能卡等(与桌面应用程序上的Kerberos或Active Directory相同。)

如果您使用像Spring Security这样的框架,这种方法甚至可以使用。只需设置拦截器,就可以单独查看身份验证表。您甚至可以使用单独的DataSource,因此您的拦截器无法查看应用程序数据,反之亦然。

显然,您的应用程序仍需要管理有关用户授权的信息,这些信息通常在“角色”表中处理。但是没有必要知道用户的身份验证方式。

答案 3 :(得分:0)

不,它不安全。在将密码存储到数据库中之前,请确保密码为Salted + Hashed。

答案 4 :(得分:0)

没有。除非每个表都需要一个不同的用户帐户才能访问它 - 这将使查询变得非常痛苦 - 即便如此,黑客已经制定了一个登录,因此很有可能他们可以获得另一个。

请确保使用SHA-2和salt等安全散列以散列形式存储密码。不要以纯文本格式存储它们,并且(恕我直言)不要将它们加密存储。

答案 5 :(得分:0)

顺便说一句,已经有一个非常简单(且功能强大)的c#salted哈希类库(它们还包括了一个如何使用该库的小型演示) - Link

它还提供了一种验证机制(因此您可以将用户的输入验证为有效密码),您可以自己选择哈希算法(Sha1 / MD5 /等)

答案 6 :(得分:0)

没有安全优势,但使用多个表对于将凭据存储到与单个登录绑定的多个系统非常有用。

如上所述,安全性应由密码的盐渍哈希提供。

答案 7 :(得分:0)

我认为用户名和密码在同一个表中是可以的,

但我也看到人们做了一些愚蠢的事情,尤其是在使用 ORM 时,有人可能最终会暴露密码哈希等

例如实体框架 C#

有人可以做到

 appcontext.Users.ToList();

没有确保密码被隐藏的属性,也没有 DTO(数据传输对象),

注意到这一点后,我只保留另一个身份验证表,另外还有很多字段用于忘记密码,最后一次更改密码时,所有这些字段我会将它们放在另一个带有密码的表中