我知道这是一个谈论的话题,但我想具体询问我的申请。还值得一提的是,我对PHP很新,并且一直在学习。
所以我用PHP和MySQL编写了一个看似基本的CRUD应用程序。我的所有代码都使用mysqli_ *,并且我尽可能地使用最佳实践。我做过的一件事,大多数人都不赞成使用MD5
哈希我的密码。我想我理解使用SHA1的目的,因为它应该需要比MD5更多的循环来散列/取消散列,并且盐应该阻止使用彩虹表。 bcrypt
是一种较新的散列算法,需要比SHA1更多的CPU周期。至少我认为这就是一切。
我理解您使用哈希/盐密码,因此如果有人访问您数据库中的用户表,他们就不会以纯文本形式看到您的用户密码。对吗?
由于我的应用程序是一个基本的CRUD系统(小型企业的库存跟踪,具有多个用户和可定义的位置),如果有人要访问我的用户表并看到这些MD5哈希值,他们可以轻松地将其转换为可读密码和登录我的系统。但是,如果他们可以访问我的数据库并查看我的用户表,那么他们可以轻松查看我的库存表,产品表以及数据库中的所有其他表,无需登录应用程序即可获取数据。目前,我的Web服务器有PHPMyAdmin和Webmin(带有MySQL模块),所以如果他们可以访问其中任何一个,他们就可以看到数据库中的数据而不关心登录系统本身。
考虑到这一点,在这种情况下最好的做法是什么?我已经在我的Web服务器上具有典型的安全性,例如阻止root SSH访问,iptables等,但就密码哈希问题而言,我是否应该更新我的代码以使用bcrypt
而不是MD5
?是否正在升级以使用bcyrpt
MD5
这个简单的过程,或者我是否需要重新设计登录系统的工作方式?
谢谢!
答案 0 :(得分:0)
来自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和其他类似的东西。
换句话说,它不是那么大的漏洞,但如果安全是你首要关注的问题,那就去吧。
答案 1 :(得分:0)
你绝对应该切换到BCrypt,因为MD5的速度太快,因此很容易被暴力破解。你可以计算每秒约8 Giga MD5个哈希值,这意味着你只需要几分之一毫秒就可以尝试整个英语词典。
您可以做的最好的事情是使用新的PHP函数password_hash()来创建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版本还存在compatibility pack。
具有对数据库的读访问权(SQL注入)并不意味着攻击者可以完全控制服务器并且可以操纵事物。