我有很容易猜到的内部标识符(自动增加数字),我想让我的客户根据这些标识符访问资源。
因为我无法为他们提供如下网址:
https://example.com/order/13
因为他们可以轻松猜出如何从此网址访问#14号订单。
因此,我考虑为他们提供标识符的盐渍哈希,如:
https://example.com/order/4643ef...
其中
4643ef… = sha256(13 + 'supersecretsalt')
从安全角度来看,这是一种好方法吗?
答案 0 :(得分:2)
首先,您不应仅仅基于uri授予对任何资源的访问权限。换句话说,用户A不应该能够访问属于用户B 的资源,即使他知道相关的uri 。为了缓解这种情况,您应该在允许访问任何(机密?)资源之前添加某种形式的身份验证和授权。
那就是说,如果你仍然想混淆uri,你可以使用GUID来代替生成任何类型的哈希。相反,在每个订单ID之前,只需将GUID与它一起存储,然后只要在URL中使用GUID就查看该ID。
旁注: 如果您确实希望让您的客户仅根据网址查找某些订单详情(即无需识别),您至少可以临时资源的可用性。您可以通过存储例如a 与GUID一起有效,直到 -date。
现在,用户A将能够通过带有guid的网址查看与其资源相关的信息,但也许仅适用于例如3天。其他用户也可以访问它,但它不太可能发生,因为它很难猜测GUID,并且因为它们只有3天的窗口才能这样做。
如果用户A需要稍后再次访问他的资源,也许您可以提供一种方法来扩展GUID的有效性,或者只是提供一个指向同一资源的新GUID,但是有效日期不同。
显然,您需要了解这是否符合您的特定情况和安全需求是否真实/可接受。