0

人々がログインできるようにするために、次のことを行うWebサイトがあります。

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/- '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']),

もう 1 つのアドバイスは、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 に答える