什么是更好的哈希或加密密码?

时间:2010-07-18 10:50:27

标签: php security hash passwords

什么最适合存储密码?我应该为您的用户表加密还是哈希密码?

你喜欢什么,为什么?能否请您提供安全密码存储的示例。

3 个答案:

答案 0 :(得分:4)

考虑到密码通常不需要检查/散列/通常(他们是登录时注册,并注册;但这就是它),速度通常不多关注点:重要的是安全性

通常做的是:

  • 当用户注册时,他键入了他的(新)密码)
  • 密码为salted +哈希,结果存储在数据库
  • 然后,当用户想要登录时,他键入了他的密码
  • 输入的内容是salted + hashed,并与存储在数据库中的值进行比较。

main 键是:永远不要将真实密码存储在数据库中 - 只是它的哈希值;并预先加盐,以避免rainbow-tables的攻击。<​​/ p>

似乎这已经是你正在做的事情 - 对你来说非常好; - )


应该使用哪种散列函数?那么,sha1通常被认为是好的; md5现在不太好了;我想,sha512应该不错。

答案 1 :(得分:1)

我通常会这样做:

<?php

function createHash($pwd, $salt = ''){
  $hash = '';
  if(!$salt){
    $salt = hash('sha256',mt_rand().time().$pwd.'2130A');
  }
  if($pwd[0] & 0){
    if($pwd[strlen($pwd)-1] & 1){
      $hash = hash('sha256', $pwd.$salt).$salt;
    }else{
      $hash = $salt.hash('sha256', $pwd.$salt);
    }
  }else{
    if($pwd[strlen($pwd)-1] & 1){
      $hash = $salt.hash('sha256',$salt.$pwd);
    }else{
      $hash = hash('sha256', $salt.$pwd).$salt;
    }
  }
  return $hash;
}

function getSalt($pwdHash){
  if($pwd[0] & 0){
    if($pwd[strlen($pwd)-1] & 1){
      $salt = substr($pwdHash,64);
    }else{
      $salt = substr($pwdHash,0,64);
    }
  }else{
    if($pwd[strlen($pwd)-1] & 1){
      $salt = substr($pwdHash,0,64);
    }else{
      $salt = substr($pwdHash,64);
    }
  }
  return $salt;
}

var_dump(createHash('testPassword',getSalt($pwdHashFromDb)) == $pwdHashFromDb); // true
  • Salting提供比通常哈希更高的安全性。
  • 盐的位置取决于输入的密码,因此盐不易被捕获。
  • 永远不知道或存储原始密码
  • 安全性和速度之间的平衡(针对网站)。

答案 2 :(得分:0)

散列而不是加密密码可以帮助保护您免受内部威胁。由于散列是一个单向过程,因此大多数情况下用户存储的散列密码不应该是可以辨认的。相反,你只能通过同样的方式运行新输入的密码尝试,看看结果是否相同。

如果您存储加密密码,我认为这意味着它们也可以解密,如果您有一个不值得信任的内部人员,这可能会有问题。

这可能是interview question的一个很好的答案,“你怎么能阻止你的DBA用你的用户密码列表取消?”

我在这里发布了一个问题https://stackoverflow.com/questions/10308694/what-is-the-right-method-for-encoding-hashed-passwords-for-storage-in-ravendb,其中包含一些示例代码。虽然问题本身可能被证明是愚蠢的,但如果c#代码是可理解的,那么代码示例可能对您有用。