你在数据库(最好是SQL Server 2005)中存储密码时,更喜欢使用什么方法/数据类型?我在我们几个应用程序中一直使用的方法是首先使用.NET加密库,然后将其作为二进制(16)存储在数据库中。这是否是首选方法或者我应该使用不同的数据类型或分配更多的空间超过16个字节?
你在数据库(最好是SQL Server 2005)中存储密码时,更喜欢使用什么方法/数据类型?我在我们几个应用程序中一直使用的方法是首先使用.NET加密库,然后将其作为二进制(16)存储在数据库中。这是否是首选方法或者我应该使用不同的数据类型或分配更多的空间超过16个字节?
我会在数据库中存储密码的盐值哈希等效物,而不是原始密码。然后将这个哈希值与用户输入的密码生成的哈希值进行比较。
在任何地方都不应该存储明文密码数据,这样做太危险了。这使得找回密码变得不可能,但当有人忘记或丢失密码时,可以通过一些检查来创建一个新密码。
首选方法:不要将密码存储在您的数据库中,只存储其哈希值。加入盐,根据口味而定。
我做的和你描述的一样,只不过我的存储是以字符串的形式。 我会将加密后的二进制值进行Base64编码。需要分配的空间量取决于加密算法/密码强度。
我认为你做得很对(假设你使用了Salt)。
通过这些措施,您的用户密码将相对较好地受到以下攻击的保护:
关于执行哈希的“最佳”方法,我已经尝试为其他 SO 问题提供了许多答案:
我使用用户名的sha哈希值、web config中的guid和以varchar(40)格式存储的密码。如果他们想要暴力破解/字典攻击,他们需要入侵web服务器获取guid。如果他们找到了密码,用户名会在整个数据库中创建彩虹表时被破解。如果用户想要更改用户名,我会同时重置密码。
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(
username.ToLower().Trim(),
ConfigurationManager.AppSettings("salt"),
password
);
简单的密码哈希,甚至是(盐 + 密码)通常不足够安全。
参见:
并且
http://gom-jabbar.org/articles/2008/12/03/why-you-should-use-bcrypt-to-store-your-passwords
两者都建议使用bcrypt算法。大多数流行的语言都可以在网上找到免费的实现。
https://web.archive.org/web/20210519000117/http://aspnet.4guysfromrolla.com/articles/081705-1.aspx https://web.archive.org/web/20210510025422/http://aspnet.4guysfromrolla.com/articles/103002-1.aspx http://www.codeproject.com/KB/security/SimpleEncryption.aspx