2011-03-14 138 views
2

我对使用密码做数据库的最佳方式有些怀疑。我需要在密码中进行加密,但是如果我使用MD5,我无法恢复密码,不是吗?数据库加密 - php/mysql

和base64编码器?它是安全的?使用这种加密技术,恢复并不是什么问题。

对此提出建议?什么是最好的方法? e更喜欢能够记住旧通行证的解决方案,而不是定义新的密码。

谢谢!

如果有人知道有关数据库中的我真的很感激

+0

您需要一个双向密码,例如DES3,但是随后您会介绍密钥管理,彩虹表和salting等问题。简单重置而不是恢复的单向散列更为常见。密码应该过期,如果用户不记得它,现在是新的一个好时机。 – tawman 2011-03-14 19:23:32

+0

我删除了加密标签。这是关于消息摘要功能。同样在未来,你应该搜索这样一个通用的问题。 – rook 2011-03-15 00:11:22

回答

2

MD5不用于加密(这意味着它可以被解密)的安全密码,而是用于消息消化/散列一个很好的教程。 Base64也不是加密,而是编码,可以毫不费力地解码。

如果数据库中的加密密码可以很容易解密,那么在加密密码存储方面通常没什么意义。

安全的方法是只存储散列并将提交的密码与存储的散列进行比较,然后将它们在运行中散列。

你应该做的线沿线的东西:

$salt = 'some2%string!!here1'; 
$hash = sha1($salt . $_POST['password']); 

创建密码的哈希值。您将该散列存储在数据库中。当用户想要登录时,您可以使用他提交的函数,使用相同的进程对其进行哈希处理,然后与数据库中的哈希进行比较。如果它们匹配,则密码是正确的。

+0

你知道任何教程来学习你的建议吗?比较散列 – 2011-03-14 19:27:46

+0

已更新我的答案以显示示例 – 2011-03-14 19:33:38

+1

要获得额外的安全性,请为每个用户随机生成'$ salt'。 – drudge 2011-03-14 19:46:25

4

如果我使用MD5我无法恢复通过, 是不是?

事实上,如果你使用hash MD5或SHA-1 您的密码(加入salt是一个好主意,顺便说一句),你将无法恢复密码; 这就是这样做的目标!

的想法是,如果有人能看看你的数据库(可能是一些邪恶的实干家,或者你的员工之一 - 谁可以是一个恶人),他将不能够找到任何有用的密码。


什么是最好的方法是什么? e更喜欢一个允许 记住旧通行证的解决方案,而不是定义 一个新的密码。

最好的方法是做与你想要的相反的东西:不允许一个人得到他的旧密码 - 并开发一些生成新密码的方法。

这样,你将确保没有人能够得到你的登录和相应的密码转储;这将使您的服务更加安全,以便您的用户(特别是考虑到许多人使用几个网站的相同登录名/密码对)

+0

迂腐笔记:您将无法直接翻转密码。然而,你可以使用彩虹表(谷歌甚至像一个工作)找到解决方案'x = md5(pass)'。所以虽然理论上它不可逆,但实际上它是... – ircmaxell 2011-03-14 20:20:32

+0

因此有关使用盐的括号;-) – 2011-03-14 20:31:03

+0

我知道,但我认为值得明确指出...... – ircmaxell 2011-03-14 20:36:45

0

base64不是“加密”。它旨在将二进制数据转换为可通过可能“破损”的电子邮件系统进行传输的安全格式,该系统无法正确处理8位二进制数据。这是谷物盒解码器环的最佳选择。

如果您想要加密,可以使用AES,DES和其他各种功能。问题是,如果你的代码可以解密密码,那么攻击者就可以知道你是如何做到的,并且/或者颠覆你的代码为他们做这件事是微不足道的。

密码永远不能以可以检索纯文本的格式进行存储。如果用户忘记了他们的密码,就会清除旧密码,生成一个新的临时密码,并强制他们在首次登录时将此临时密码更改为其他密码。

0

您不应该永远不需要记住用户的密码 - 这样做是违反了他们的信任并提出了安全漏洞。

通常你会使用MD5散列密码(现在最好使用SHA-2),并且当用户提交他们的密码以尝试登录时,也要散列该密码,并查看散列是否为比赛。

为了增加安全性,您可以为数据库创建一个“salt”列,并在首次提交密码时生成一个随机salt。将盐添加到密码的开头,然后对其进行散列。将salt +密码的哈希和salt一起存储。现在,当用户提交他的密码登录时,您可以将它与salt结合,对其进行散列,并检查散列是否匹配。

盐可以确保如果多个用户拥有相同的密码(他们可能会这样做),他们的密码哈希将不会相同。

如果用户忘记密码,他们将不得不提供一个新密码,只需存储他们的密码并在忘记密码时将其发回给他们是不好的做法并且向用户表明您不处理他们的隐私好。

0

如前所述,保存密码时使用散列而不是加密。我通常不会使用随机盐,因为这意味着数据库中有一个额外的字段,以便您可以对用户进行身份验证。最简单的解决方案是将密码用作盐,如下所示。易于使用且易于验证。

$salt = $_POST['password']; 
$hash = sha1($salt . $_POST['password']); 
1

首先,有一个Significant Difference Between Hashing and Encryption。我建议你在继续阅读之前给予阅读...

现在,至于你确切的问题,有几种方法可以解决它。

  1. 使用强密码加密您的密码,以便在必要时加密您的密码。解决方案such as the one in this post可能适用于此。但是请注意,这不是一个好主意,因为如果你的系统受到威胁,所有的密码都会被泄露(从来不是一个好主意)。有很少使用情况下才有意义来存储它们加密,但如果你绝对必须,请使用强密码加密日常使用强做...

  2. 存储你的密码单向散列法。不,md5($password)不够好。但都不是sha1($salt . $password)。第一个是trivial to lookup most passwords,第二个可以通过简单的试验和错误在合理的时间内暴力破解。相反,stretch your passwords iteratively。最好的方法是使用标准的PBKDF2函数从密码生成强大的单向密钥。

    至于如何恢复用户忘记密码,请不要担心。如果用户忘记密码,请创建一个新密码并将其提供给用户。这是处理被遗忘密码的行业标准方式(Heck,Windows和Mac都是这样做的)。你可能会认为你是通过发送给他们来帮助你的用户,但是你所做的只是关闭任何使用你的应用程序而对安全性有任何线索的人(并且使得人们疯狂你会受到影响)。

0

立即停止并阅读this。然后去找一个开源的库来做用户认证。我不是一个PHP开发人员,所以我不能向你推荐一个,但我确定它们存在。他们会遇到已经发现的安全漏洞。

此外,对于密码,您应该查看bcrypt或类似的密码散列函数,而不是使用像MD5或SHA这样的快速散列算法。