【问题标题】:What is better hashed or encrypted passwords?什么是更好的散列或加密密码?
【发布时间】:2010-07-18 10:50:26
【问题描述】:

什么最适合存储密码?我应该为您的用户表加密或散列密码吗?

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

【问题讨论】:

  • 什么速度?您是在 486 芯片上运行,还是必须每秒散列 2.5 亿次通行证?伙计,你在“优化”什么?!
  • 感谢摇滚!你在那里救了我。

标签: php security hash passwords


【解决方案1】:

考虑到密码通常不需要检查/散列/任何经常(它们是在登录和注册时;但仅此而已),速度通常不高关注点:重要的是安全

一般做的是:

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

main 关键是:永远不要在数据库中存储真正的密码——只存储它的哈希值;并提前加盐,以避免rainbow-tables的攻击。

看来这已经是你正在做的事情了——这对你来说很好;-)


应该使用哪个散列函数?好吧, sha1 通常被认为是 OK ; md5 现在不太好;我猜 sha512 应该还不错。

【讨论】:

  • 但这不是矫枉过正吗?你呢,你是怎么做到的。 ?
  • @Adam,考虑到安全性,没有所谓的矫枉过正;-)。当然,您的密码哈希方案可能是牢不可破且无关紧要的,因为您可能有一个硬编码的管理员帐户,密码为“0000”。一个系统的安全性取决于它的最弱 组件,而这些组件通常很难找到。但是,您可以确定它很可能不会是您的密码散列罪魁祸首,并且做错或好的通常需要相同的努力,所以我认为这是不费吹灰之力。
【解决方案2】:

我通常会这样做:

<?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 提供比普通哈希更高的安全性。
  • salt 位置取决于输入的密码,因此这使得 salt 不易被捕获。
  • 原始密码永远不会知道或存储
  • 在安全性和速度之间取得平衡(适用于网站)。

【讨论】:

  • 它是一种静态盐。类似于密钥的东西。
【解决方案3】:

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

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

这可能是对interview question 的一个很好的回答,“您如何阻止您的 DBA 使用您的用户密码列表?”

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

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 2015-06-29
    • 1970-01-01
    • 2011-02-18
    • 2021-08-25
    • 2017-05-15
    • 2011-06-23
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多