通过散列键保护URL参数安全吗?

问题描述 投票:1回答:3

我想让用户在其帐户外共享数据,并汇总了一个概念证明,该概念证明本质上生成具有相关URL参数的唯一URL来显示数据。

显然,普通的URL只会让您修改参数,修改查询并提取所需的任何数据。因此,有了这个,当用户生成一个共享数据的链接时,我将使用参数,添加复杂的盐,对组合的字符串(sha-2)进行哈希处理,然后将其用作键。因此,URL可能类似于:

mydomain.com/app/shared.php?function=form&account=1&form=a19481e78dd87f5eb04afe94c85ea4f3&key=7dcaa38baa19e0f70262d8775582300346f5c544

输入URL后,服务器将重新编译参数和秘密盐并验证密钥。如果密钥无效,则不会显示任何数据。

我确实考虑过通过将参数存储在数据库中来进一步保护这一点,因此URL看起来更像mydomain.com/app/h6Hs52ff2a,并且参数从未直接包含在URL中,但同样,我非常喜欢即时生成可共享URL的想法。没有数据库后端。

我感觉到上述方法可能会有些皱眉,但同样地,除非您知道存储在服务器上的盐(它本身很复杂),否则我看不到任何绕过这种系统的方法。

最欢迎的想法。

php security
3个回答
2
投票

这是一种完全可行的方法,本质上是签名URL。该系统的唯一弱点是盐/密钥的保密性。如果您使用的是快速散列/加密算法和较弱的盐/密钥,则可以在离线状态下强行破解秘密。因此,您需要使用足够强的(读:慢)算法来防止这种情况发生(普通的SHA2太快了!),并且需要确保密钥不会泄漏。您还需要确保您不会意外丢失密钥,因为那样会重置所有共享URL。如果正确完成此操作,则这是一种很好的无状态操作方式。

我想研究JWTs作为您自己开发的方法的替代方法,因为它们基本上已经包含了您的所有要求(它们实际上是任意签名的数据包)。

数据库方法的优点是它没有攻击面,并且您可以有选择地使共享URL无效。缺点是它使用数据库存储,这可能会产生操作开销。

这里另一个决定因素是URL长度,您可能会或可能不在乎。


1
投票

看着您要达到的目标使我感到奇怪,为什么不简单:

  • 每次用户希望共享URL时,将数据库中的128位随机值映射到一组表单参数。它与您使用的随机数生成器一样安全,并且表单值仍然是秘密(因为它们永远不会离开服务器)。
  • 使用带有消息身份验证的密码(使用GCM或OCB等模式的身份验证加密)对参数进行加密。除非钥匙泄漏,否则请确保安全。对用户隐藏表单参数。
  • 仅使用“认证加密”的一部分,例如消息认证代码(MAC; HMAC)。不隐藏表单参数,而是添加需要验证的代码。

0
投票

如果需要保证,当您共享带有链接的文档时,它与Google云端硬盘使用的概念相同。

一些评论:

  • 共享链接的可读性。如果共享数据始终是相同类型的模型(例如帐户数据),则链接确定。但是,如果可以共享其他类型的数据(例如用户详细信息),我会将其包含在URL中,以便获得共享链接的人可以理解该链接。
  • 如果您想增加安全性,可以为每个用户设置一个密钥。您需要将密钥保留在每个用户的数据库中。
  • [生成网址时,添加一个期满参数和哈希。当读取哈希链接时,您可以查看链接是否过期。
  • 请确保使用URL安全字符
© www.soinside.com 2019 - 2024. All rights reserved.