Django与Python的链接加密

0 投票
4 回答
1362 浏览
提问于 2025-04-16 08:28

我有一个下载应用程序,我想对文件下载的链接进行加密,这样用户就不知道文件的ID了。此外,我还想在链接中包含日期和时间,并在提供文件时检查链接是否仍然有效。

这里有一个类似的问题,可以查看,但我在字符编码方面遇到了问题,因为我希望有像 /file/encrypted_string/ 这样的URL,指向下载的视图,所以最好是加密后的结果只包含字母和数字。我不太想使用哈希,因为我不想在某个地方存储哈希和文件的对应关系。我不知道是否有好的加密方法能满足我的需求...

4 个回答

0

你可以把任何字符转换成网址格式,在Django框架中,你可以使用它的urlencode过滤器来做到这一点。

不过,生成一个随机字符串并保存它和原始字符串的对应关系会更安全。

1

处理这个问题最简单的方法就是为每个文件生成一个随机字符串,并把这些随机字符串和实际的文件名或文件ID对应起来。这样就不需要复杂的加密了。

补充说明:无论如何,你都需要存储日期来实现链接过期的功能。所以,你可以把过期日期和随机字符串一起存储,然后定期从表格中删除过期的链接。

2

听起来这事儿挺简单的,特别是如果你不介意一直用同一个加密钥匙的话。你只需要用某个符号(比如 / 或 : 都可以)把文件名、日期/时间和其他你想加的东西分开,然后进行加密和 base64 编码!记得用 urlsafe_b64encode,而不是普通的 b64encode,因为后者会生成不合法的链接。虽然生成的字符串会很长,但这有什么关系呢?

我做过几次这个,稍微改了一下:在钥匙的最后加几个随机字符,然后把它放在字符串的开头或结尾——这样比总是用同一个钥匙更安全,而且不需要麻烦的数据库映射。只要你的钥匙复杂到一定程度,暴露出来的部分就不够让黑客随意生成请求。

当然,如果文件不存在,别让他们看到解码后的结果……

撰写回答