来自密码PHP的表单3或4随机密码字符

来自密码PHP的表单3或4随机密码字符,php,mysql,ajax,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 用户名: 密码(输入以下字符:)字符

我见过一些网站要求用户从他们的密码中随机输入3或4个字符来访问网站帐户。我想知道如何使用PHP5、MySQL和Ajax实现这一点

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

username: password: Submit Button 用户名: 密码: 提交按钮 但我想做以下登录表单:

username: Password (Inptut the following Chars:) Char 1[] Char 3[] char 7[] Submit button 用户名: 密码(输入以下字符:)字符1[]字符3[]字符7[] 提交按钮 字符1、3和7是随机的,取决于原始密码的长度


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

我最初的想法是从拆分用户密码和获取三个随机密钥索引中选择随机字母。这些键索引表示密码中的三个字母

使用这些键索引,我构建了一个更小的数组,其中键是密码中字符的数字索引,值是字符本身

$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的字符。他们提交的值可以与您随机生成的值进行比较。

以登录形式(使用jquery):

在LOGIN.PHP脚本中(其中encrypt_pass是一个定义的密码加密函数,LANDING_PAGE是您希望登录用户在成功登录时前往的位置):

$result=mysql\u query(“选择unencrypted\u pass,encrypted\u pass FROM user='{$\u POST['user']}'”);
$pass=mysql\u fetch\u数组($result);
对于($i=0;$itrue,“位置”=>登录页面));
这假设服务器知道您的密码,因此您可以将给定的字符放入字符串中,然后将字符串与加密版本进行比较。这是我唯一能看到它工作的方法,因为不可能取消密码加密(如果密码加密正确的话)。
我想知道这有什么用,但是…

所以如果你的密码是“foobar”,并且要求你插入字符1、3和5,你会插入“foa”?这样做的目的是什么?是的,这是正确的,背后的原因;它为登录增加了一层额外的安全性,特别是如果你在一个不安全的环境中登录,你知道完整的密码,但它从来没有在按键时完全传递。有点像使用电话银行,他们要求从你的电话银行号码随机3-4个字符。谢谢你用最好的方式来描述它。这是一个有趣的想法!但它确实要求站点存储未加密的密码(或以易于恢复的格式)。因此,安全风险与其说是降低了,不如说是转移了。您是否对服务器和数据库的安全性有足够的信心,并愿意承担这一责任?
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");
});
$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));