PHP CRUD应用程序,密码设置

PHP CRUD应用程序,密码设置,php,mysql,hash,md5,bcrypt,Php,Mysql,Hash,Md5,Bcrypt,我知道这是一个讨论过的话题,但我想特别问一下我的申请。还值得一提的是,我对PHP相当陌生,并且一直在学习 因此,我使用PHP和MySQL编写了一个看似基本的CRUD应用程序。我所有的代码都在使用mysqli_*,我已经尽可能地使用最佳实践。我做过一件大多数人都不喜欢的事情,那就是使用MD5散列我的密码。我想我理解使用SHA1的目的,因为它需要比MD5更多的周期来散列/取消散列,而salt应该防止使用rainbow表bcrypt是一种较新的哈希算法,需要比SHA1更多的cpu周期。至少我认为一切都

我知道这是一个讨论过的话题,但我想特别问一下我的申请。还值得一提的是,我对PHP相当陌生,并且一直在学习

因此,我使用PHP和MySQL编写了一个看似基本的CRUD应用程序。我所有的代码都在使用mysqli_*,我已经尽可能地使用最佳实践。我做过一件大多数人都不喜欢的事情,那就是使用
MD5
散列我的密码。我想我理解使用SHA1的目的,因为它需要比MD5更多的周期来散列/取消散列,而salt应该防止使用rainbow表
bcrypt
是一种较新的哈希算法,需要比SHA1更多的cpu周期。至少我认为一切都是这样的

据我所知,您对密码进行哈希/salt处理,因此,如果有人访问了您数据库中的用户表,他们不会以纯文本形式看到您的用户密码。对吗?
由于我的应用程序是一个基本的CRUD系统(小企业的库存跟踪,具有多个用户和可定义的位置),如果有人要访问我的用户表并查看这些MD5哈希,他们可以轻松地将其转换为可读的密码并登录到我的系统。但是,如果他们能够访问我的数据库并查看我的用户表,那么他们就可以轻松地查看我的库存表、产品表以及数据库中的所有其他表,而无需登录到应用程序即可获取数据。目前,我的web服务器有PHPMyAdmin和Webmin(带有MySQL模块),因此如果他们能够访问其中任何一个,就可以看到数据库中的数据,而不必关心登录到系统本身

考虑到这一点,这种情况下的最佳做法是什么?我的web服务器上已经有了典型的安全性,例如阻止根SSH访问、iptables等,但就密码散列而言,我是否应该麻烦升级代码以使用
bcrypt
而不是
MD5
?从
MD5
升级到使用
bcyrpt
是一个简单的过程,还是我必须重新设计登录系统的工作方式

谢谢

来自PHP.net

   $hashed_password = crypt('mypassword'); // let the salt be automatically generated

   /* You should pass the entire results of crypt() as the salt for comparing a
   password, to avoid problems when different hashing algorithms are used. (As
   it says above, standard DES-based password hashing uses a 2-character salt,
   but MD5-based hashing uses 12.) */
   if (crypt($user_input, $hashed_password) == $hashed_password) {
      echo "Password verified!";
   }
看起来没那么难吧?请记住,密码并不是最大的漏洞,保护一个站点免受所有XSS、CSRF和其他类似东西的攻击需要花费更多的时间


换句话说,它并不是那么大的漏洞,但如果安全性是你最关心的,那就去做吧。

你肯定应该切换到BCrypt,因为MD5速度太快,因此很容易被暴力强迫。你可以计算每秒的哈希数,这意味着你只需要一毫秒的一小部分就可以尝试一本完整的英语词典

最好使用新的PHP函数来创建BCrypt哈希

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
对于早期的PHP版本,也存在一个新的解决方案


拥有对数据库的读访问权(SQL注入)并不意味着攻击者完全控制服务器并可以操作

这看起来并不难,但是
crypt()
bcrypt()
相同吗?相似之处?无论如何,我使用的是PHP-FPM5.4.x。还有,为什么要投否决票?否决票不是我投的,所以我不知道。实际上,PHP直到5.5才有bcrypt实现,在5.5中引入了
password\u hash()
。但是您可以将
河豚
编码算法与
密码
结合使用。@PHP.net提供了详细信息。像这样使用的crypt函数将计算未加盐的DES哈希,对密码进行哈希运算非常不安全。