2014-01-24 27 views
-1

我知道这是一个话题,但我想具体询问我的应用程序。还值得一提的是,我对PHP相当陌生,并且一直在学习。PHP CRUD应用程序,密码拥有

所以我写了一个看似基本的CRUD应用程序,使用PHP和MySQL。我所有的代码都使用mysqli_ *,并且尽可能地使用最佳实践。我所做的一件事是,大多数人都皱眉,用MD5来密码。我认为我理解使用SHA1的目的,因为它应该比MD5需要更多的周期来散列/散开,盐应该防止使用彩虹表。 bcrypt是一种较新的散列算法,需要比SHA1更多的CPU周期。至少我认为这就是一切。

这是我的理解,你散列/盐密码,所以如果有人获得访问您的数据库中的用户表,他们没有看到你的用户密码在纯文本。对?
由于我的应用程序是一个基本的CRUD系统(针对小企业的库存跟踪,具有多个用户和可定义的位置),如果有人要访问我的用户表并查看这些MD5哈希,他们可以很容易地将其反转为可读密码并登录到我的系统中。但是,如果他们可以访问我的数据库并查看我的用户表,那么他们可以轻松地查看我的库存表,产品表和数据库中的所有其他表,无需登录到应用程序即可获取数据。目前,我的Web服务器有PHPMyAdmin和Webmin(带有MySQL模块),所以如果他们能够访问其中的任何一个,他们可以看到数据库中的数据,而不用担心登录系统本身。

考虑到这一点,在这种情况下最好的做法是什么?我的网络服务器已经具有典型的安全性,比如阻止root SSH访问,iptables等,但就密码散列而言,我是否应该打扰升级我的代码以使用bcrypt而不是MD5?是否升级到使用bcyrptMD5一个简单的过程,或者我将不得不重新设计我的登录系统是如何工作的?

谢谢!

回答

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和其他整洁的东西的影响。

换句话说,它并不是那么大的脆弱性,但如果安全是您首要关心的问题,那就去做吧。

+0

这看起来并不困难,但是'crypt()'与'bcrypt()'相同吗?相似之处?对于它的价值,我使用PHP-FPM 5.4.x. 另外,为什么downvote? – dhorn

+0

Downvote不是来自我,所以我不知道。实际上,PHP在5.5之前没有bcrypt实现,其中引入了'password_hash()'。但是你可以使用带'crypt'的'blowfish'编码算法。提供的详细信息@ PHP.NET – Eternal1

+0

像这样使用的crypt函数将计算无信息的DES散列,并且对散列密码非常不安全。 – martinstoeckli

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注入)并不意味着攻击者可以完全控制服务器并可以操纵事物。