0

我有一个网站,我在其中执行以下操作以让人们登录:

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): - rout 文件转发/salt//login//process/salt/- /process/login/'session' 类被自动加载

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 的情况下登录过程尽可能安全。

4

1 回答 1

0

如果我猜对了,您是在数据库中存储密码的 md5 哈希版本吗?

用全局盐存储密码的哈希并将该全局盐也传递给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);

对于服务器端的散列,您可以使用phpass 的 spark-version,每个人都建议使用它。或者您可以将其安装为库。

于 2012-05-05T15:05:44.967 回答