2012-04-11 51 views
-1

我見過幾個網站,要求用戶隨機輸入3或4個字符的密碼以獲取網站帳戶的訪問權限。我想知道如何使用PHP5,MySQL和可能的Ajax來做到這一點。表格3或4密碼隨機密碼字符PHP

所以,如果我有一個標準的登錄表單我有

username: 
password: 
Submit Button

但我想做好以下登錄表單:

username: 
Password (Inptut the following Chars:) Char 1[] Char 3[] char 7[] 
Submit button

字符數1,3 & 7隨機取決於原始密碼的長度。

如果你做了這樣一個腳本,並可以提供一些線索上,或可能全worknig劇本我可以看看我會很感激。

+0

所以,如果你的密碼是「foobar」,並且你被要求插入字符1,3和5,你會插入「foa」?這樣做的目的是什麼? – Sampson 2012-04-11 20:07:17

+0

是的,這是正確的,它背後的原因;它爲登錄添加了額外的安全層,特別是如果你在一個沒有安全的環境中登錄,你知道完整的密碼,但是它從來沒有完全通過關鍵敲擊。有點像使用電話銀行服務,他們會要求從電話銀行號碼中隨機輸入3至4個字符。感謝描述它的最佳方式。 – ThickyBlack 2012-04-11 20:27:27

+1

這是一個有趣的想法!但它確實要求網站存儲未加密的密碼(或以一種容易恢復的格式)。所以安全風險並沒有因爲轉向而減少。你對你願意承擔的服務器和數據庫的安全性有足夠的信心嗎? – octern 2012-04-11 21:12:38

回答

1

我最初的想法是從分裂用戶密碼中選擇隨機字母,並抓取三個隨機密鑰索引。這些密鑰索引代表密碼中的三個字母。

使用這些鍵索引,我建立一個較小的陣列,其中的關鍵是在密碼的字符的數值指標,並且該值是字符本身。

$password = str_split("stackoverflow"); 
$randChar = array_rand($password, 3); 

foreach ($randChar as $key => $val) 
    $letters[$val+1] = $password[ $val ]; 

在這一點上,我們的$letters陣列可以是這個樣子:

Array 
(
    [3] => a 
    [5] => k 
    [8] => e 
) 

注意。這是一個隨機集合。使用此設置,您可以要求用戶提供字符作爲位置3,5和8.他們提交的值可以與隨機生成的值進行比較。

1

在登錄表單(使用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加密版本。這是我看到這個工作的唯一方法,因爲不可能解密密碼(如果它們被正確加密的話)。 我想知道這是如何有用,但...