我使用hash创建了一个PHP unsubscribe脚本:
<?php
$email_addr = "myemail@mydomain.com";
$confirmation = hash("sha256", 'mysalt' . $email_addr . 'moresalt');
$link = "unsubscribe.php?id=$email_addr&validation_hash=$confirmation";
echo 'Do you really want to unsubscribe?<br><br>';
echo '<a href="'.$link.'">Yes. I want to unsubscribe!</a>';
?>
后端(unsubscribe.php)的作用很常见:登录mysql数据库,检查该用户是否为活动订阅者。如果是,请取消订阅。
攻击者可以使用curl(或类似的东西)来破解验证哈希吗?或者也许攻击者可以通过无限循环来关闭网站?
谢谢。
答案 0 :(得分:3)
所以成功取消订阅需要的是:
哈希,包括:
显然,该哈希的第一部分是多余的,留下第二部分:静态盐。这对每个人来说都是一样的价值。每个哈希都使用相同的值计算。如果这个价值公之于众,那么你所有的安全都会消失,任何人都可以取消订阅。
如何公开了解盐?
让我们更好地了解最后一个:攻击者可以自己完成订阅/取消订阅过程,以获取已知电子邮件地址的哈希值。所以他们有两个组成哈希的部分之一。 SHA系列哈希特别是 fast ,因此攻击者可以简单地尝试一大堆salt值,直到找到你正在使用的相同哈希值。那时他们知道盐......
所以,是的,不是最好的实施。
而是生成一个 完全随机的 值(从/dev/urandom
读取),并使用数据库中的电子邮件地址存储并将其用作验证< del> hash 标记。此值与任何其他数据无关,也不能强制脱机。这使得攻击者只有可能发生在线攻击(实际上是一个接一个地请求许多URL),这个数量级要慢一些,这使得它不可行;并且它允许你额外减慢攻击者的速度,或者如果你发现这样的攻击则直接阻止他们。