我不时听到"使用bcrypt在PHP中存储密码,bcrypt规则"的建议.
但是什么bcrypt呢?PHP没有提供任何此类功能,维基百科关于文件加密实用程序的唠叨和Web搜索只是揭示了不同语言的Blowfish的一些实现.现在Blowfish也可以通过PHP获得mcrypt,但是如何帮助存储密码?Blowfish是一种通用密码,它有两种工作方式.如果它可以加密,则可以解密.密码需要单向散列函数.
解释是什么?
我现在是一名学生,我正在学习PHP,我正在尝试在PHP中对数据进行简单的加密/解密.我做了一些在线研究,其中一些很混乱(至少对我而言).
这是我正在尝试做的事情:
我有一个由这些字段组成的表(UserID,Fname,Lname,Email,Password)
我想要的是加密所有字段然后解密(是否可以sha256用于加密/解密,如果不是任何加密算法)
我想要学习的另一件事是如何创造一种hash(sha256)与良好"盐"相结合的方式.(基本上我只是希望有一个简单的加密/解密实现,hash(sha256)+salt)
先生/女士,你的答案会有很大的帮助,非常感谢.谢谢++
所以,我知道这已经完成了死亡,但我遇到的所有答案都非常令人困惑/相互矛盾,或者他们的解释是不完整的,我正在努力跟上并利用所有资源做到这一点可用,但我想我已经失去了某个地方.我想一劳永逸地澄清一下.感谢您提前耐心,因为这可能会让您有点长时间的啰嗦.
我的页面顶部有一个小的登录框,如果用户没有登录,它将保持不变.如果他们已登录,那么他们将看到一个问候语,其中包含他们的名字,而不是登录框.
会话检查
首先,这里是一个图表(据我所知到目前为止)如何检查用户是否可以访问"仅限会员"的内容.(此代码位于页面顶部以检查和设置变量,例如$loggedin = true;)

就目前而言,我$_SESSION['loggedin']只是用户名.根据我的理解,会话可以伪造或劫持来自同一个域,因此我知道这是非常不安全的(例如,攻击者可能会以某种方式创建一个包含不同用户名和会话的会话 - 即时访问该用户的东西)但是我不知道我应该如何检查会话.我可以想象这样做的唯一方法是每次加载页面时连接到数据库并检查MD5哈希或来自数据库的东西(并更新它)但我想这会产生大量不必要的服务器流量而且我我几乎可以肯定有更好的方法.
在登录
以下是用户登录时发生的情况(以及是否显示问候语或登录框).

在大多数情况下,我非常坚定这部分(我希望),但我不知道我的MD5哈希应该包含什么,以便以后能够重新检查数据库中的哈希值, cookie和一个新生成的哈希,以确保攻击者没有召唤出一个cookie.另外,如下面的评论中所述,我可能会废弃在哈希中使用IP地址以允许用户保持从多个位置登录(例如,他们的手机和笔记本电脑.)
所以我的问题是:
如果您有什么想问的话,请在评论中告诉我,我很乐意用尽可能多的信息来编辑我的问题.
我正在使用PHP.我曾经使用原生的mysql函数password()来存储密码.我被告知密码()不再安全了.在PHP中存储密码的最佳方法是什么?是MD5吗?
salt密码存储有什么好处?
MD5:
$hash = md5($password . $salt);
Run Code Online (Sandbox Code Playgroud)
Password_hash:
$hash = password_hash($password, PASSWORD_DEFAULT, $salt);
Run Code Online (Sandbox Code Playgroud)
SHA1:
$result = sha1($salt.$string);
Run Code Online (Sandbox Code Playgroud) <?php
$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, $password) == $password) {
echo "Password verified!";
}
?>
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我认为这'mypassword'是我希望实际管理员使用的密码.所以我首先加密,并将其设置为等于$password.显然,我必须将其存储在DB中.但在接下来的行中,它被用作盐和我正在比较的东西,我不明白怎么crypt($user_input, $password)可能等于$password,如果在后一种情况下我理想的是正确的密码, …
我正在阅读有关如何安全地存储密码的相互矛盾的建议.我所知道的不是使用MD5!我见过人们主张使用PHP的bcrypt功能,这看起来好像它会占用服务器的处理器.我见过盐的倡导者,并主张不使用盐.
这一切都是如此不清楚.关于如何安全地存储密码,是否有真实可信的建议?
编辑:经过大量研究后,我发现了一篇文章;登录:深入讨论该主题:http://www.usenix.org/publications/login/2004-06/pdfs/alexander.pdf