Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 公开页面上的ID哈希与加密_Php_Security_Encryption_Hash - Fatal编程技术网

Php 公开页面上的ID哈希与加密

Php 公开页面上的ID哈希与加密,php,security,encryption,hash,Php,Security,Encryption,Hash,我已经读了很多关于这个主题的文章,但是他们似乎对这个问题不屑一顾,认为它不重要,所以如果我给你一个真实世界的例子,也许会影响答案 管理联系人列表和发送电子邮件的系统,但允许收件人使用唯一的url取消订阅 因为这是一个公共页面,所以对于某些人来说,仅仅增加ID并取消订阅其他用户是很简单的 我不想为每个用户/联系人/列表组合添加一个必须存储在数据库中的唯一哈希 最好的方法是什么?下列情况之一是否可以接受 a) 加密所有ID并解密服务器端 b) 在url中包含一个基于3个ID和一个salt的哈希,然后

我已经读了很多关于这个主题的文章,但是他们似乎对这个问题不屑一顾,认为它不重要,所以如果我给你一个真实世界的例子,也许会影响答案

管理联系人列表和发送电子邮件的系统,但允许收件人使用唯一的url取消订阅

因为这是一个公共页面,所以对于某些人来说,仅仅增加ID并取消订阅其他用户是很简单的

我不想为每个用户/联系人/列表组合添加一个必须存储在数据库中的唯一哈希

最好的方法是什么?下列情况之一是否可以接受

a) 加密所有ID并解密服务器端


b) 在url中包含一个基于3个ID和一个salt的哈希,然后在服务器端确认它

我使用过的所有邮件列表都向我发送了一封确认邮件以取消订阅,其中可能包含一个随机且唯一的令牌,该令牌在几小时后过期

我不想为每个用户/联系人/列表组合添加一个必须存储在数据库中的唯一哈希


您不必提前创建它们,也不必无限期地存储它们。您可以在收到取消订阅请求时创建随机令牌,并在完成或过期时将其删除。

为什么不愿意为每个用户创建唯一令牌? 您不必为您描述的每个组合(用户/联系人/列表)创建它,只需为您与电子邮件地址关联的用户创建它即可


然后对每个操作使用该标记。使用后再更换。刚刚生成了20个随机数。这既简单又安全。

在哈希表中为每个用户使用电子邮件地址和用户id(对于列表中可能重复的地址)。将哈希和地址一起存储在数据库中


这样,如果您不知道其他用户的电子邮件,则很难复制哈希。

我的看法是,有人花了几年时间编写新闻通讯软件(SAAS)

为每个用户\joiner\member SAN创建一个哈希,并将其与其他详细信息一起存储。在取消订阅的链接中使用该链接

我的链接中总是有两个散列,一个是时事通讯发送散列,然后你可以跟踪他们取消订阅的那个,以及每个人的散列

如果您确实想在一定时间后使不明嫌犯链接过期,正如Thilo所建议的,您可以使用新闻稿发送散列所确定的新闻稿发送日期,但如果该链接被视为旧链接,您将希望为他们提供另一种方法。例如另一封电子邮件

强制性的代码

$hash = md5(uniqid(true));

存储在具有唯一索引的db字段中。如果您愿意,您可以将电子邮件地址添加到mix中,但uniqid()的设计是独一无二的。

据我所知,您的问题和评论如下:

  • 允许用户单击一个链接即可取消订阅
  • 不要在数据库中存储任何单个令牌
您将在服务器上由http GET请求触发一个操作,如

http://youremailsystem.tl/unsubscribe&user=12&contact=34&list=56
虽然您的建议1)加密增加了隐私的额外好处(URL不会泄露执行参数的操作),但第2)是更简单的方法

你。输入将是您想要签名的参数加上一个永远不会离开服务器的密钥

$signature = hash_hmac('sha256', $url, $mysecretkey);
$url = $url . '&signature=' . $signature;
这使得签名成为您电子邮件中取消订阅URL的一部分

http://youremailsystem.tl/unsubscribe&user=12&contact=34&list=56&signature=b1812e463a7
无论何时收到GET请求,都可以验证参数是否未更改

粗略代码:

// extract sent signature from url:
$sent_signature = //substr($sent_url ...

// strip signature from URL:
$sent_url = //substr($sent_url ...

// repeat hashing:
$correct_signature = $signature = hash_hmac('sha256', $sent_url, $mysecretkey);

if( $sent_signature == $correct_signature ) {
    // do the unsubscribe
}


请注意,任何URL都可以重复调用,因此请确保您永远不要重复使用您的任何ID,否则您将使前用户能够在很长时间后取消订阅新用户,而新用户现在拥有自己的ID。

我相信您最好的方法是为每个用户随机生成一个标识符。我做您说不想做的事,也就是说,为每个用户存储一个唯一的哈希值,就这样,您不必预先存储令牌,它们可以在收到退订请求时创建。您的空间太小,无法与用户存储哈希值?1000-50000不多,我有数百万人谁不想做的事情不明嫌犯,你是很难与额外的电子邮件确认。我不喜欢过期的想法,我可能会回来在一个星期或一个月,并使用一个旧的电子邮件链接取消当一个过期的代币被使用,然后你会收到一个新的代币邮寄。关键是,你需要证明你当时对该电子邮件地址有控制权。但是,就个人而言,作为用户不喜欢它,所以不要作为开发人员。此外,如果链接没有过期,并且你不小心转发了电子邮件或向某人发送了你页面的HTML,你有麻烦了。在这种情况下,被另一个人取消订阅可能不会是世界末日。如果你知道另一个人的电子邮件地址,那么再重复一遍也没什么大不了的。过期的完全随机令牌是最好的。无法猜测(因为它们是随机的),无法被盗(因为它们过期)。您需要结合每封电子邮件的用户id了解对方的电子邮件。这将是一个非常棘手的问题。:)@Henkealg,对于一个意志坚定的攻击者来说,没有什么是真正棘手的。一个想要取消订阅网站全部用户群的攻击者。用户的电子邮件地址和用户名不难找到。至少在你的散列中使用一些秘密信息。我喜欢这个想法,因为获得散列/电子邮件/id的正确组合很难,但它可以通过蛮力攻击破解,@Adnan说的是有可能的。但问题是,如果我使用的是基于用户(而不是联系人)的令牌,那么令牌就会在发送时被发现,而且黑客可以有效地取消订阅所有收到这封电子邮件的联系人。由于电子邮件保留在“联系人”收件箱中,因此令牌也必须保持有效。我可能最终会为每个收件人存储一个唯一的令牌。我不确定是否可以遵循您的fir