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/0/email/3.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
Security 我应该如何为每个预订生成唯一的链接,以便我的用户可以看到独立的电子邮件?_Security_Email_Language Agnostic_Hash - Fatal编程技术网

Security 我应该如何为每个预订生成唯一的链接,以便我的用户可以看到独立的电子邮件?

Security 我应该如何为每个预订生成唯一的链接,以便我的用户可以看到独立的电子邮件?,security,email,language-agnostic,hash,Security,Email,Language Agnostic,Hash,当我的网站用户进行预订时,会发送电子邮件确认。我被要求在顶部添加一个“查看此电子邮件有问题?”链接,该链接指向网站上的电子邮件 我不知道该如何生成链接,以便用户可以查看此电子邮件 请注意,我使用的是第三方预订系统,该系统会给我一个确认码,例如:12345BE913913,其中12345是属性,BE始终是BE,而913913是辅助号码。 我想知道我能不能把这个号码散列成链接?例如sha1('12345BE913913')变成070bae598f481351e24975d6509fc0a73cad9

当我的网站用户进行预订时,会发送电子邮件确认。我被要求在顶部添加一个“查看此电子邮件有问题?”链接,该链接指向网站上的电子邮件

我不知道该如何生成链接,以便用户可以查看此电子邮件

请注意,我使用的是第三方预订系统,该系统会给我一个确认码,例如:
12345BE913913
,其中
12345
是属性,
BE
始终是
BE
,而
913913
是辅助号码。 我想知道我能不能把这个号码散列成链接?例如
sha1('12345BE913913')
变成
070bae598f481351e24975d6509fc0a73cad9a17

然后,电子邮件中的链接变成类似于
href=”http://blah.com/email/view/070bae598f481351e24975d6509fc0a73cad9a17

问题#1:这是一种非常标准、安全的方法吗

如果是这样的话,我还有一个问题……我需要提取这些信息,以便在我的
电子邮件/视图中生成电子邮件。web服务只接受确认代码,因此我必须将原始代码
12345BE913913
提供给它。因此我不能简单地获取所有确认代码,将它们全部删除,然后查看是哪一个ne等同于
070bae598f481351e24975d6509fc0a73cad9a17


问题#2:我唯一的选择是通过接受原始确认码的Web服务获取预订信息,创建一个本地数据库存储所有确认码,然后将所有确认码都存储起来,看看是否等同于
070bae598f481351e24975d6509fc0a73cad9a17
来提取它?不是afe要在电子邮件中使用实际的确认码,是吗?

如果需要可逆操作,为什么要使用SHA1?为什么不改为使用符号算法(如Twofish)对其进行加密以生成URL。您可以在服务器端使用密钥对其解密以恢复原始确认码,然后将确认码发送到第三方预订系统。由于没有其他人拥有您的密钥,因此没有其他人可以恢复确认码。

对真实标识符进行散列,并将散列作为密钥存储在表中,以原始值进行“反向查找”是一种传统方法

然而,这不是唯一的选择。你可以加密确认码。因为确认码很短,而且(我认为)是唯一的,所以可以使用ECB模式和分组密码,这将使生成的密码文本保持较短(16字节而不是SHA-1的20字节)

ECB需要注意的是,相同的确认码将始终生成相同的密码文本。很可能,一个代码只在一封电子邮件中发送;但是,如果发送多次,攻击者将能够确定该电子邮件与相同的确认码相关(但他们无法确定确认码本身)


我不知道你说的“安全”是什么意思。有人能用确认号做什么?他们能用哈希从你的网站上得到确认号吗?除非你使用S/MIME(或PGP),否则电子邮件不是私人的;假设攻击者可以阅读电子邮件。

为什么不同时传递确认号(作为主键)以及与之相关的MAC(防止人们猜测URL)

URL生成伪代码:

$mac = HMAC_SHA1($server_secret, $confCode);
$url = "http://$baseURL?conf=$confCode&m=$mac";
$mac = getParam("m");
$confCode = getParam("conf");
$expectedMac = HMAC_SHA1($server_secret, $confCode);
if($mac != $expectedMac) { # Or in real perl, ne instead of !=
  return errorPage();
}
return email($confCode);
电子邮件显示伪代码:

$mac = HMAC_SHA1($server_secret, $confCode);
$url = "http://$baseURL?conf=$confCode&m=$mac";
$mac = getParam("m");
$confCode = getParam("conf");
$expectedMac = HMAC_SHA1($server_secret, $confCode);
if($mac != $expectedMac) { # Or in real perl, ne instead of !=
  return errorPage();
}
return email($confCode);

你不需要一个本地数据库将确认码映射到$server/secret或MAC吗?编辑:哦,你是根据确认码生成的吗?所有MAC都使用一个密码。该链接为你提供确认码和MAC。除了一个服务器密码,你不需要存储任何东西。愚蠢的问题是,如何存储你会生成服务器密码吗?它是一个相对简单的带数字的短语,还是你会推荐一个较长的短语?这根本不是一个愚蠢的问题。因为它只会被计算机(而不是人类)使用,所以它可以(也应该)使用要长且随机。我会用一个好的密码生成器生成一个16个字符的随机密码并使用它。那么AES而不是Twofish呢?“河豚鱼是Twofish的直接前身。Twofish是Bruce Schneier参加产生AES的比赛的作品。它被认为不如后来成为AES的名为Rijndael的作品。"