【发布时间】:2011-07-22 19:51:53
【问题描述】:
有几种方法(即使在 SO 中也是如此),他们都提到在数据库中保存密码的最佳方法是保存,不是密码,不是 hased 密码,而是 存储 salted 的哈希密码。
我的问题很简单,放一些代码,这样是不是正确的方式?
string username = "myUsr";
string password = "myPwd";
DateTime createDate = DateTime.UtcNow;
// Salt it
string saltedPwd = String.Concat(password, createDate.Ticks.ToString());
// Hash it
HMACSHA1 hash = new HMACSHA1(Encoding.Unicode.GetBytes(Helper.EncryptKey));
string encodedPwd = Convert.ToBase64String(
hash.ComputeHash(Encoding.Unicode.GetBytes(saltedPwd)));
// Create User in the database
db.CreateUser(username, encodedPwd, createDate);
数据库用户表
user_id | username | password | create_date | last_access | active
在登录使用时再次执行该过程并检查encodedPwd 是否与提供的加盐密码相同。
我唯一担心的是,这是加盐密码的最佳方法吗? 可以使用创建日期(因为它总是会改变,我读到最好总是使用每次我们编码密码时都会有不同的salt...
或者应该是salt 一个完全不同的变量?
【问题讨论】:
-
我会说这很好,我会很舒服。打败彩虹桌就足够了。
-
你下次怎么验证密码,你的salt是UtcNow
-
@V4Vendetta 这是附加到 UserRow 中
CreateDate的日期,所以我总是可以检查后者...日期也放在表中。 -
您可以考虑另外使用用户 ID 对其进行加盐处理。这可以防止将数据库中的一个密码复制到另一行,从而更改用户的密码。
-
@balexandre:抱歉错过了,我唯一担心的是 ToString() 和 datetime 一样是特定于文化的,所以在这部分需要小心
标签: c# encryption hash passwords