ログインフォームで (jquery を使用):
var passChars = [SOME,SERVER,DEFINED,CHARS]; // some random chars set by server
$('#submit').click(function(){
$.post("login.php", { user: $('#username').text(), pass: $('#pass').text(), 'chars[]':passChars}, function (data)
{
if(data.suc)
window.location(data.location);
else
alert("Try again");
}, "json");
});
IN LOGIN.PHP SCRIPT (encrypt_pass は定義済みのパスワード暗号化関数であり、LANDING_PAGE はログインしたユーザーが成功した場合に移動する場所です):
$result = mysql_query("SELECT unencrypted_pass, encrypted_pass FROM users WHERE user = '{$_POST['user']}'");
$pass = mysql_fetch_array($result);
for($i = 0; $i<count($_POST['chars']);$i++){
$pass[0][(int)$_POST['chars'][$i]] = $_POST['pass'][$i];
}
if($pass[1] == encrypt_pass($pass[0])) // success
echo json_encode(Array("suc"=>true, "location"=>LANDING_PAGE));
これは、サーバーがパスワードを知っていることを前提としているため、指定された文字を文字列に入れ、文字列と暗号化されたバージョンを比較できます。パスワードの暗号化を解除することは不可能であるため (パスワードが正しく暗号化されている場合)、これが機能していることを確認できる唯一の方法です。これがどのように役立つかは疑問ですが...