在登錄表單(使用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腳本(如果encrypt_pass是定義的密碼加密功能和LANDING_PAGE是你希望在loggged用戶去成功的位置):
$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));
這假定服務器知道你的密碼,這樣就可以把給定的字符爲字符串,然後比較字符串VS加密版本。這是我看到這個工作的唯一方法,因爲不可能解密密碼(如果它們被正確加密的話)。 我想知道這是如何有用,但...
所以,如果你的密碼是「foobar」,並且你被要求插入字符1,3和5,你會插入「foa」?這樣做的目的是什麼? – Sampson 2012-04-11 20:07:17
是的,這是正確的,它背後的原因;它爲登錄添加了額外的安全層,特別是如果你在一個沒有安全的環境中登錄,你知道完整的密碼,但是它從來沒有完全通過關鍵敲擊。有點像使用電話銀行服務,他們會要求從電話銀行號碼中隨機輸入3至4個字符。感謝描述它的最佳方式。 – ThickyBlack 2012-04-11 20:27:27
這是一個有趣的想法!但它確實要求網站存儲未加密的密碼(或以一種容易恢復的格式)。所以安全風險並沒有因爲轉向而減少。你對你願意承擔的服務器和數據庫的安全性有足夠的信心嗎? – octern 2012-04-11 21:12:38