我们的网站长期使用电子邮件确认程序来确认新会员的电子邮件地址。该函数使用下面进一步描述的散列函数。现在我们正在使用更强大的流程升级我们的取消订阅功能,并且作为该流程的一部分,正在提出类似的确认机制。 (取消订阅程序与电子邮件确认程序不同。)
我的问题是看两种不同的机制,基于哈希的经文基于加密,我们是否引入了任何漏洞?
在我看来,新提出的基于加密的机制在几个方面更好,甚至比传统的基于散列的机制更强。
以下是详细信息:
基于散列的机制会向发送给用户的电子邮件中插入一个包含查询字符串的链接,如下所示:
https://www.ourdomain.com/ourpage.php?hash=b7e64c61be853daa1d31a2b879634d09&email=mailbox%40ourdomain.com
哈希是电子邮件地址的简单哈希,它以纯文本形式包含在查询字符串中。哈希函数如下:
md5('mailbox@ourdomain.com' . HASH_PADDING);
当用户点击该链接时,在创建页面期间会发生以下情况:
我们更喜欢建议的基于加密的机制,我们认为这种机制更简单,更强大。
以下是建议的基于加密的机制:
基于加密的机制会向发送给用户的电子邮件中插入一个包含查询字符串的链接,如下所示:
https://www.ourdomain.com/ourpage.php?code=eStYWlBPNVkvL1ljSk1yWHFkNkkvejFGUzcwSTFON1ZFU0NZdzE2dGRoMD0=
代码是带有初始化向量的电子邮件地址的加密版本。我认为提供加密的详细信息并不重要,请注意使用openssl_encrypt库以及base64编码。
当用户点击该链接时,在创建页面期间会发生以下情况:
基于加密的方法的好处如下:
基于加密的方法的缺点:
另请注意,安全策略不涉及任何高安全性需求。我们所做的只是确认会员的电子邮件地址。
重申一下这个问题:我们是否在建议的基于加密的方法中引入了任何漏洞?
答案 0 :(得分:0)
散列是电子邮件地址的简单散列,以纯文本形式包含在查询字符串中。哈希函数如下:
md5('mailbox@ourdomain.com' . HASH_PADDING);
您听说过length extension attacks吗?如果您将填充放在前面而不是添加,那么您将完全容易受到教科书LEA的攻击。</ p>
就目前而言,对于哈希函数,MD5是一个非常差的选择。您需要SHA256。如果将其与密钥结合使用,则需要HMAC-SHA256。
hash_hmac('sha256', 'mailbox@ourdomain.com', HASH_PADDING);
我不认为重要的是要提供加密的细节,除了要注意,还使用了openssl_encrypt库以及base64编码。
您认为错了!阅读using encryption and authentication securely。例如,如果您使用的是AES-256-CBC,则攻击者可以使用padding oracle attack来解密电子邮件地址,而无需知道密钥,从而破坏了加密。
要重申这个问题:我们是否使用建议的基于加密的方法引入任何漏洞?
可能。见上文。