アルゴリズムというほどではないですが、よくあるのは、
- 一定の回数、繰り返しログインに失敗したアカウントは、その後一定の期間、ロック (ログインが失敗させられる) する。
というものでしょうか。ログインが失敗する「一定の期間」は、数分だったり数時間だったり、場合によっては永遠 (本人がなんらかの方法で解除申請するまでアカウントを凍結する) だったりします。不正アクセスを「特定」することはできませんが、攻撃者を足止めする効果はありそうです。
この方式の仕組みは簡単です。データベースを使うのであれば、テーブルに必要な列はこれだけです。
- ID (あるいはアクセス元IPアドレスなどの、ユーザをある程度識別できるもの)
- 間違った回数 (初期値: 1)
- ロック開始時刻 (初期値: Null)
- パスワードを間違ったら、そのユーザのレコードを追加します。
- レコードがすでにあれば、以後間違うたびに回数を加算しますが、一度でも成功したらレコードを削除します。
- 回数が閾値を超えたらもう加算はせず、ロック開始時刻をセットします。
- ロック中はそのユーザのログインを失敗させます。
- ロック開始時刻から一定時間がたったら、レコードを削除します。
保持する情報が少ないことには、もう一つ重要な意味があります。毎回のログイン結果を記録するということは、ユーザの行動を逐一記録することです。このような個人の特定につながる情報を、最低限必要な程度を超えてサーバに蓄積することは、望ましいことではありません。