PHP和MySQL安全性:单向加密vs双向加密

4

我读到了使用MySQL AES_ENCRYPT/AES_DECRYPT(双向加密)不如使用PHP - hash()(单向加密)更安全。

http://bytes.com/topic/php/answers/831748-how-use-aes_encrypt-aes_decrypt

如果“与其向用户发送密码,不如只发送一个链接,用户可以单击该链接以重置密码”,这种说法更为安全,这是真的吗?

此外,如果我使用MySQL AES_ENCRYPT/AES_DECRYPT(我非常喜欢...),我如何定义可以被MySQL接受的密钥?例如,密钥的长度是否很重要?或者我可以简单地使用“123123@123123”作为我的密钥吗?

谢谢!

5个回答

7
这两个概念——哈希和加密——有一个根本性的区别:
加密可以被反转,哈希则不行(至少是这样想的)。

如果恶意用户能够访问数据库中的密码并知道您用于加密它们的密钥,则可以恢复这些密码。如果它们被散列了,他们将无法做到这一点。
这就是为什么密码应该始终使用哈希(和盐),永远不要加密。

例如,密钥的长度是否很重要?或者我可以简单地使用“123123@123123”作为我的密钥吗?

据我所知,MySQL的AES_ENCRYPT可以接受任意长度的密钥;但显然,较短的密钥会使攻击者更容易进行暴力破解(即:尝试所有可能的组合)。

2
双向加密本质上不太安全,因为真实数据存储在某个地方。也就是说,你有一个密码“hello”。然后你对它进行哈希,得到5d41402abc4b2a76b9719d911017c592。这对普通人来说毫无意义,他们不知道如何解密它而不知道正确的加密算法。他们也不能使用它,因为只使用原始密码。通过对其进行哈希并将其与哈希(也存储)进行比较来检查密码。5d41402abc4b2a76b9719d911017c592进行哈希处理后为69a329523ce1ec88bf63061863d9cb14,因此它们不匹配。即使用户知道哈希密码,他也无法从中获得任何信息。
因此,您可以存储加密数据,但如果在取出数据时对其进行解密,则任何人都可以使用它。
将链接发送给用户与提供密码的安全性是不同的问题。如果您通过电子邮件发送密码,则所有人都可以看到(和使用)明文。给他们一个链接以允许他们输入新密码意味着没有人会看到它,这更安全一些,但如果犯罪分子已经可以访问该链接,则会引起问题。
关于AES,我一下子找不到太多关于它的信息,但看起来它不关心你加密什么。因此,如果您使用AES_DECRYPT(AES_ENCRYPT('x','b'),'b');它将返回“x”。您必须跟踪密钥。

1

如果您使用对称加密在服务器上存储密码,那么您必须解码存储的密码以将其与用户提交的密码进行测试。这意味着密钥也必须存储在服务器上。这意味着任何入侵您的Web应用程序的人都可以检索和解密每个用户的密码。(并将它们用于破坏用户使用相同密码的其他帐户。)

哈希密码意味着您甚至不知道密码是什么,因此无法将密码泄露给攻击者。您仍然可以通过使用相同的算法和盐来哈希密码来检查提交的密码是否与原始密码相同,因此您仍然可以告诉提交的密码是正确还是错误,而无需知道密码是什么。

使用哈希密码确实意味着您无法在“恢复密码”选项中告诉用户他们的密码是什么。但是您真的不想这样做,特别是通过不安全的机制(如电子邮件)。一次性、限时的重置密码链接具有相同的目的,但潜在的损害更小。


1

对于密码来说,单向哈希几乎总是最好的选择。单向哈希意味着除了用户之外,很少有人能知道他们的密码。

如果您选择单向路线,则需要设置密码重置方法。如果正确执行,对于大多数目的而言,它应该相当安全。为了获得更好的安全性,您可以添加诸如安全问题(例如,“您最喜欢的颜色是什么?”)等内容,用户必须在通过电子邮件接收密码重置链接之前回答这些问题。

至于AES_ENCRYPT/DECRYPT的密钥-- MySQL将接受函数的key参数的可变长度,但它将始终使用128位密钥,因此最好传递至少128位的值。


0

单向加密意味着只能进行加密操作。(例如,您加密密码并存储结果。每当用户进行认证时,您会将用户输入的内容加密并进行比较。在这种情况下,没有解密功能是必要的。)

双向加密意味着有加密和解密两个功能可用。在 PHP 中,可以通过 mcrypt_encrypt()mcrypt_decrypt() 函数实现。

更新!mcrypt 在 PHP 7.1 中已被弃用,并在 7.2 中被删除。请改用 OpenSSL 或 Sodium 来进行加密和解密操作。


1
更新!mcrypt在PHP 7.1中已被弃用,并在7.2中移除。请尝试使用OpenSSL或Sodium替代进行加密和解密功能。详情请参阅OpenSSLSodium - Muhammad Sheraz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接