从密码PHP中形成3或4个随机密码字符

时间:2012-04-11 20:03:19

标签: php mysql ajax

我见过一些网站要求用户随机输入3或4个字符,以获取网站帐户的访问权限。我想知道如何使用PHP5,MySQL和可能的Ajax。

所以,如果我有一个标准的登录表单,我就有

username:
password:
Submit Button

但我想做以下登录表单:

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

Chars 1,3& 7是随机的,取决于原始密码的长度。

如果您已经完成了这样的脚本并且可以对其进行说明,或者可能有一个完整的工作脚本我可以看一下,我将不胜感激。

2 个答案:

答案 0 :(得分: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 :(得分:1)

IN LOGIN FORM(使用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));

这假定服务器知道您的密码,因此您可以将给定的字符放入字符串中,然后比较字符串与加密版本。这是我能看到这个工作的唯一方法,因为无法解密密码(如果它们被正确加密)。 我想知道这是如何有用的,但是......