我有一个网站,我在其中执行以下操作以便让人们登录:
jQuery: - 使用$ .md5()插件和$ .cookie()插件(用于发布数据的CodeIgniter CSRF保护cookie)
$('#login').on('submit', function(e){
e.preventDefault();
$.get('/salt/', function(salt){
// get / set salt and salt flashdata
$.post('/login/', {
'username' : $('#l_username').val(),
'password' : $.md5('' + salt['m'] + $.md5($('#l_password').val()) + salt['s']),
//set to string (in case MD5 hash of password is an integer)hash password, add salt, hash salted password.
'_token' : $.cookie('_cookie')
}, function(r){
// *r* == 0: unknown user; 1: wrong password; 2: logged in; 3: database error; 4: session error;
// perform action depending on *r* value
})
})
});
PHP(CodeIgniter): - 路由文件将/salt/
和/login/
转发给/process/salt/
和/process/login/
- “会话”类自动加载< / p>
class Process extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->model('login'); // loads model with login functions ()
}
public function login() {
$data = array();
$data['username'] = $this->input->post('username');
$data['password'] = $this->input->post('password');
if ($data['username'] && $data['password']) {
//if user and password are set
$user = $this->login->getUser($data['username']);
if ($user->num_rows() === 1) {
// if the username is in the database
$user = $user->row();
$salt = $this->session->flashdata('s');
//flashdata set by ajax call to '/salt/'
$pass = $salt->m . $user->password . $salt->s;
//password is already hashed in database
if ($data['password'] === $pass){
// update logged_in database table then set login session
echo 2; // logged in; if database / session error, echo 3 / 4
} else {
echo 1; // wrong password
}
} else {
echo 0; //unknown user
}
}
}
public function salt() {
// set salt values based in minute and second time
$salt = (object) array('m' => intval(date('i')), 's' => intval(date('s')));
//intval() removes leading 0
$this->session->set_flashdata('s', $salt);
// flashdata only valid for the next server request (which is the login);
header('Content-type: application/json');
//return value as json string
echo json_encode($salt);
}
}
我的问题是:这个登录方法究竟有多安全?脚本中是否存在潜在的漏洞?我想确保登录过程尽可能安全,没有https。
答案 0 :(得分:0)
如果我猜对了,你在数据库中存储了md5-hashed版本的密码?
使用全局盐存储密码的哈希并将该全局盐传递给javascript不是更好吗?这样你的数据库中就没有哈希,如果它是一个简单的密码就很容易解密。
更好的是为每个用户使用个人盐,您可以与其他盐同时使用。
'password' : $.md5('' + salt['m'] + $.md5($('#l_password').val() + salt['personal']) + salt['s']),
另一个建议是使用比md5更强的散列函数,因为它不再那么安全了。
但是,这是因为您的数据库泄露了。密码和用户名的传输看起来非常安全和混淆。
我认为你还有一个错误,因为在将它与收到的值进行比较时,你不会在php端创建一个md5哈希密码。我认为它应该是:
//flashdata set by ajax call to '/salt/'
$pass = md5($salt->m . $user->password . $salt->s);
对于服务器端的散列,您可以使用每个人都建议使用的spark-version of phpass。或者您可以将其安装为库。