正如您发现的那样,没有内置任何内容,因此您必须为用户存储以前的密码 - 确保它们经过散列或加密 - 并检查该列表以确保它们没有重复使用。确保您使用相同的盐进行散列/加密,否则您将永远无法匹配相同的密码。
我会存储他们以前的所有密码。这意味着当它们发生 5 次更改时,您不必从表中清除旧数据,并且如果要求更改为不重用最后 10 或 15 次更改,您将拥有数据。如果您还存储了密码更改的日期,您可以建立一个检查来说明过去 12 个月内没有重复使用。
当您存储散列/加密密码并检查是否有可能从系统中获取纯文本版本时。
我有一个“UserId”、“Password”和“DateChanged”的表。然后,您可以找到该用户的最后 N 个密码,并将新密码的散列/加密版本与此列表进行比较:
var encryptedPassword = MembershipProvider.EncryptPassword(password);
int numberOfReuse = 5; // or configurable
var historiesQuery = (from histories in dataContext.GetTable<PasswordHistory>()
where histories.UserId == userId
orderby histories.PasswordDate descending
select histories.Password).Take<string>(numberOfReuse);
return historiesQuery.Contains<string>(enycryptedPassword);
如果密码已被使用,则返回 true。
要进行基于日期的检查:
var encryptedPassword = MembershipProvider.EncryptPassword(password);
DateTime testDate = DateTime.Now.AddMonths(-12); // configurable
var historiesQuery = (from histories in dataContext.GetTable<PasswordHistory>()
where histories.UserId == userId
and histories.PasswordDate >= testDate
orderby histories.PasswordDate descending
select histories.Password);
return historiesQuery.Contains<string>(enycryptedPassword);