Encryption 在URL中中断MD5以进行时间验证

Encryption 在URL中中断MD5以进行时间验证,encryption,hash,Encryption,Hash,我试图创建一个具有过期时间的令牌,以确保客户端(在web应用程序中)只能在定义的时间内访问 我想要一些像 我看到前面提到的令牌是从一个散列函数(MD5)创建的,带有(PATH+SECURETOKEN+TIME)的消息摘要,事实上,我猜PATH+SECURETOKEN只能合并到一个变量中,比如SECURE_代码 我怀疑,在服务器中,当发出请求时,URL被解析,令牌被解密,过期时间被验证 最后,我的问题是: 考虑hash=MD5(SECURETOKEN+TIME),一旦我有了SECURETOKEN,

我试图创建一个具有过期时间的令牌,以确保客户端(在web应用程序中)只能在定义的时间内访问

我想要一些像

我看到前面提到的令牌是从一个散列函数(MD5)创建的,带有(PATH+SECURETOKEN+TIME)的消息摘要,事实上,我猜PATH+SECURETOKEN只能合并到一个变量中,比如SECURE_代码

我怀疑,在服务器中,当发出请求时,URL被解析,令牌被解密,过期时间被验证

最后,我的问题是:

考虑hash=MD5(SECURETOKEN+TIME),一旦我有了SECURETOKEN,就可以解密hash了吗?如果否,令牌对时间验证有多大用处


提前谢谢

您不需要解密令牌来验证它是否正确-您只需要使用相同的密钥重新计算它,并检查生成的令牌是否相同

事实上,生成(和验证)此类令牌的推荐方法是使用消息身份验证代码,如(它在内部使用哈希,但以抵抗某些潜在攻击的方式进行)。您将提供您的秘密令牌密钥作为HMAC的密钥输入,并将要使用令牌验证的数据(即,在本例中为路径和到期时间)作为消息。虽然KeyCDN使用的特殊“连接和散列”构造可能适合此特定目的,但它缺乏广泛的安全分析和HMAC的冗余安全功能,并且可能容易受到攻击,例如,如果验证代码碰巧错误地接受格式不正确的到期时间戳


此外,在新系统中,您确实应该使用MD5以外的其他哈希函数。虽然MD5在HMAC中使用时(或在其他仅要求不可逆性而不要求抗碰撞性的应用中)仍然被认为是安全的,但已知的实际攻击使其在某些其他用途中完全不安全。更新、更安全的散列函数,如SHA-2或SHA-3,将是更安全的选择。

实际上,我在其他两个不同的系统中见过两次这种技术。我想了解这是如何可能的考虑使用,但如果SECRETKEY=SECRETTOKEN+TIME,并且时间是从客户端时间获取的,我将如何做到这一点。在服务器端,我只有SECRETTOKEN和散列(SECRETTOKEN+TIME)?看看链接到的KeyCDN示例代码如何实际计算令牌;e、 在PHP示例中:
$md5=md5($path.$secret.$expire,true)
(然后,
$md5
被base64url编码以获取令牌)。验证令牌时,服务器知道
$path
$expire
(因为它们在URL中)以及
$secret
(因为您将其输入了CDN设置),因此如果该路径的令牌是使用相同的密钥生成的,则服务器可以重新计算该路径的令牌和到期时间。注意这里的秘密是一个任意的常量字符串;这不取决于有效期。哦!伙计,这是个愚蠢的问题。。。很抱歉因此,如果没有最后一个参数,$expire不可能恢复消息的一部分,好吗?不,当然,如果您真的需要,您可以尝试蛮力方法,即尝试
$expire
的所有可能值,并查看其中哪一个(如果有)给出了正确的令牌。