实现登录密码混合动态因子,且动态因子隐式
此处使用php语言进行演示
思路
登录过程: 后端: 新增(进入登录页面时的时间戳+固定字符进行MD5)显式验证token参数以及进入登录页面时的时间戳参数通过前端将参数提交给后端,并将显式验证token参数存入session(隐式) 前端: 将获取的密码参数和显式验证token参数进行MD5
验证过程【后端】: 1、验证请求参数是否存在显式认证token以及时间戳 2、时间戳+固定字符进行MD5是否等于请求参数中的显式认证token 3、session是否存在验证token 4、session中的验证token是否等于请求参数中的显式认证token 5、从数据库获取对应用户的密码加上显式验证token参数进行MD5和传来的密码参数是否一致 6、登陆成功清除session中的验证token
示例代码
login.php
<form>
<div id="input_pwd"><img src="img/login/password.png"><input id="v2password" type="text" name="psw" maxlength="20" autocomplete="off" style="text-security:disc;-webkit-text-security:disc;ime-mode:disabled"></div>
<?php
$nTime = time();
$sSalt = md5("Xff89741+-&".$nTime);
$_SESSION['login_token'] = $sSalt;
?>
<input id="token_time" value="<?php echo $nTime; ?>" type="hidden">
<input id="token_salt" value="<?php echo $sSalt; ?>" type="hidden">
</form>
login.js
url: 'verify.php',
params: {
username: username,
password: hex_md5(token_salt + hex_md5(password)),
time: token_time,
salt: token_salt
},
verify.php
$username = $_POST['username'];
$password = $_POST['password'];
$token_time = $_POST['time'];
$token_salt = $_POST['salt'];
session_start();
if (empty($token_time) || empty($token_salt)) {
echo json_encode(array('data' => '5', 'msg'=>'参数异常,请刷新页面后重新尝试登录'));
exit;
}
//if ($token_time < (time() - 120)) {
// echo json_encode(array('data' => '5', 'msg'=>'您在登录页面停留太久(超过2分钟),请刷新页面后重新尝试登录'));
// exit;
//}
if (md5("Xff89741+-&".$token_time) !== $token_salt) {
echo json_encode(array('data' => '5', 'msg'=>'认证参数不正确,请刷新页面后重新尝试登录'));
exit;
}
if (empty($_SESSION['login_token'])){
echo json_encode(array('data' => '5', 'msg'=>'token参数异常,请刷新页面后重新尝试登录'));
exit;
}
if ($_SESSION['login_token'] != $token_salt){
echo json_encode(array('data' => '5', 'msg'=>'token参数失效,请刷新页面后重新尝试登录'));
exit;
}
// $userInfo从数据库获取赋值, $userInfo['UserPwd']这个值在数据库中是MD5加密了的
if (md5($token_salt.$userInfo['UserPwd']) == $password) {
unset($_SESSION['login_token']);
}
|