【问题标题】:Sending encrypted text in Url在 URL 中发送加密文本
【发布时间】:2011-06-25 11:27:03
【问题描述】:

我有一个非常简单(相当愚蠢)的问题,希望有人能澄清我的想法:)

我想在我的网站用户单击按钮后向他发送电子邮件。此电子邮件将在链接 URL 中包含带有用户用户 ID 的链接(作为链接的查询参数)。

一旦用户单击此电子邮件链接,我的服务器端代码将解析和解密 userID 查询字符串密钥以获取用户 ID 并对其执行一些操作。

我不能使用 base64 编码,因为它可以反转,“黑客”可以知道真实的用户 ID。我必须加密 ID,但是当我使用 AES 算法进行加密时,浏览器无法“理解”加密文本,即我无法将加密的 userId 文本作为 URL 的一部分传递,因为它包含未编码的字符,例如“/”,浏览器无法绕过。我能想到的一种选择是在通过 URL 发送加密文本后对加密文本进行 base64 编码。然后我可以对它进行bease64解码和解密。

这种方法比在加密文本上使用 Uri.EscapeDataString() 更好吗?

【问题讨论】:

  • 这些标签有什么相关性?您可以考虑在security.stackexchange.comwebmasters.stackexchange.com 上提问。
  • 向用户发送一个密钥/令牌,并使用它访问数据库,并从数据库中获取 userId 和链接。我认为这样更安全。 (一旦链接被使用,在数据库中将其标记为过期)

标签: encryption


【解决方案1】:

您应该继续对 AES 数据进行 base64 编码,因为此时它可能是二进制而不是可以转义的字符串。您还应该检查您是否使用 url 安全 base64 编码。

【讨论】:

    【解决方案2】:

    使用 SHA1 或 MD5 等单向哈希,并使用 JavaScript 以加密方式发送值。然后,如果黑客拦截了请求,他们将只有哈希值而不是实际值。不过,他们仍然可以将哈希发送到登录;一种解决方案是包含一个基于 IP 的 JavaScript 参数(通过您的服务器端语言生成)(但黑客无法找到其公式),并使用它来对用户名和密码哈希进行加盐。

    然后在服务器端你会做(在这种情况下,在 PHP 中):

    $ipHash = sha1("random" . $_SERVER['REMOTE_ADDR'] . "salt_here10381") // place this as a hidden element in the form and use it in the JavaScript to calculate the hash
    $userHash = $_POST['userHash'];
    $passwordHash = $_POST['passwordHash']
    // TODO: Escape $ipHash, $userHash, $passwordHash
    $results = mysqli->query("SELECT * FROM `users` WHERE SHA1(CONCAT('" . $ipHash . "', `user`)) ='$userHash' AND SHA1(CONCAT('" . $ipHash . "', `password`)) = " '$passwordHash'");
    

    然后,如果黑客想要使用他们找到的哈希和用户名登录,他们将需要与最初登录其凭据被截获的用户相同的 IP。

    请注意,这假定您将密码以纯文本形式存储在数据库中,您永远不应该这样做。

    对于使用 SHA1 的哈希,在客户端,请查看 this

    要回答您的具体问题(我看到我有点跑题了,哎呀,),当您将哈希发送到服务器时,对哈希进行 base64 编码是可以接受的。如果可能,尝试将其作为 POST 数据发送,并将其保存在 cookie 或会话变量中。

    【讨论】:

    • 原来的问题表明 userID 是一个查询参数,这意味着它需要渲染页面,因此需要解密。散列算法不能解决加密问题。
    【解决方案3】:

    我想到了一个简单的解决方案,您尝试生成一个随机数(将其作为密钥)并使用自己的一些简单技术进行加密,例如 XOR 将用户名中字符的 ASCII 值与密钥您已生成 .so 长随机密钥会产生更大的结果。

    【讨论】:

      【解决方案4】:

      创建电子邮件时,您需要对用户 ID 进行加密,然后对其进行 base64 编码,然后对其进行 URL 编码。将此作为 userID 参数放在链接中。

      在解密电子邮件时,您反向执行相同的操作;获取userID参数,URL解码,base64解码再解密。

      请记住,每次对用户 ID 进行编码时,都要使用不同的初始化向量。您还需要将初始化向量作为 URL 参数放入电子邮件链接中,以便对其进行解密。

      【讨论】:

      • 为什么要经过三个步骤?
      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 2023-03-19
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2016-12-12
      • 2011-10-07
      相关资源
      最近更新 更多