お気づきのように、何も組み込まれていないため、ユーザーの以前のパスワードを保存する必要があります-それらがハッシュまたは暗号化されていることを確認し、そのリストをチェックして、それらが再利用されていないことを確認します. ハッシュ/暗号化に同じソルトを使用していることを確認してください。そうしないと、同じパスワードに一致することはありません。
以前のパスワードをすべて保存します。これは、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);