Sql 您会使用一个或两个表格作为用户名和密码吗?
创建一个包含用户信息的表并为其密码创建另一个表是否比在所有内容中使用同一个表更安全?不,我会这样做: id、用户名、密码 其中id是autoincrement,username是20的varchar(根据您的需要大约是20),password是带salt的MD5或SHA1散列密码Sql 您会使用一个或两个表格作为用户名和密码吗?,sql,mysql,security,database-design,Sql,Mysql,Security,Database Design,创建一个包含用户信息的表并为其密码创建另一个表是否比在所有内容中使用同一个表更安全?不,我会这样做: id、用户名、密码 其中id是autoincrement,username是20的varchar(根据您的需要大约是20),password是带salt的MD5或SHA1散列密码 用两张桌子做这个根本没有意义。然后需要使用连接来获取数据。这只是一个不必要的负担。不,这并不安全。只需确保在将密码存储到数据库之前对其进行了salt+hash处理。不,我不知道如何使其更安全 实际上,您应该完全避免存储
用两张桌子做这个根本没有意义。然后需要使用连接来获取数据。这只是一个不必要的负担。不,这并不安全。只需确保在将密码存储到数据库之前对其进行了salt+hash处理。不,我不知道如何使其更安全 实际上,您应该完全避免存储密码。只要把他们的咸土豆条储存起来就行了 进一步阅读:
只需确保以散列形式存储密码,使用安全散列,如SHA-2和salt。不要以明文形式存储,也不要加密存储。我不同意其他人的意见-将身份验证信息放在单独的表中,并尽可能将身份验证完全从应用程序中取出。你不应该在意。想想siteminder之类的东西——您的web应用程序没有任何关于用户如何进行身份验证的信息。密码、智能卡等(与桌面应用程序上的Kerberos或Active Directory相同) 如果您使用像Spring Security这样的框架,这种方法甚至可以工作。只需设置拦截器,使其单独查看身份验证表。您甚至可以使用单独的数据源,这样拦截器就看不到应用程序数据,反之亦然
显然,您的应用程序仍然需要管理有关用户授权的信息,这些信息通常在“角色”表中处理。但是它不需要知道用户是如何通过身份验证的。顺便说一句,已经有了一个非常简单(而且功能强大)的c#salted hash类库(它们还包括一个如何使用该库的小演示)
它还提供了一种验证机制(因此您可以验证用户的输入是否为有效密码),并且您可以自己选择哈希算法(Sha1/MD5/等等)。没有安全优势,但是使用多个表对于存储绑定到单个登录的多个系统的凭据非常有用
如上所述,安全性应该由密码的salt散列提供 我认为将用户名和密码放在同一个表中是可以的 但我也看到有人在做一些愚蠢的事情,特别是在使用ORM时,有人可能会暴露密码哈希等 例如,实体框架C# 有人能做到
appcontext.Users.ToList();
不保留任何属性,确保密码被隐藏或DTO(数据传输对象)
注意到这一点后,我只保留了另一个身份验证表,还有一件事,我有很多字段用于忘记密码,上次密码更改所有这些字段,我会将它们放在另一个带有密码的表中不要忘了将盐添加到表中。你不必这样做。您可以对每个密码使用一个salt。如果数据库被黑客入侵,他们就没有盐了。如果您将其添加到数据库中,他们会这样做。salt的概念只是最终用户对结果哈希没有最终控制权。谢谢大家!我知道咸土豆条。我只是想知道拥有两个表是否会增加任何有价值的安全功能。干杯同意Michael的意见-每个密码都需要唯一的密码。您应该始终假定攻击者可以使用盐。使用全局salt,攻击者可以一次构建密码字典,并对数据库中的所有用户使用它。使用唯一的每密码salt,攻击者必须为每个用户构建不同的字典,这很困难。如果他只想要一个特定用户的密码,这两种方法都不会有帮助;但是,当你谈到成千上万的用户时,唯一的salt会有很大帮助。同意唯一的(每个用户)salt,但不是将salt单独存储到一个新列中,你可以使用现有列(带有静态数据)作为salt-例如用户名。+1绝对-你只需要比较哈希值是否相等。谢谢Adam。当我思考这个问题的时候,我正处于这种状态:黑客会访问所有的东西吗?我想这是在我学习一些Unix和/etc/passwd和/etc/shadow等文件时发生的。在阅读了我的问题的答案后,很明显这个想法对Web应用程序没有帮助(更不用说Unix案例有历史记录了)。在单独的表中存储用户名和密码对应用程序是否处理身份验证有何影响?