混淆之后可以在网址中使用的字符串

Obfuscating a string that can afterwards be used in a web address

我在 Flask 中有一个简单的小型服务器,我希望能够使用以下路由路由到用户页面:

@app.route("/something/<string:username>", methods=["GET"])

当它是一个明确的用户名时,这不是问题,但是我想添加简单的混淆,以便在给定密钥时生成一个新字符串,该字符串仍然可以在网址中使用。

我尝试了在 Stack Overflow 中找到的几种方法,但输出字符串存在各种问题,例如非 ASCII 字符,或者在路由中给我带来问题的字符(例如 /混淆烧瓶)。

理想情况下,我希望有两个函数,obfuscate(key, string)deobfuscate(key, string) 这样我就可以像这样使用了:

@app.route("/something/<string:username>", methods=["GET"])
def user_page(username):
    # username is an obfuscated string
    clear_username = deobfuscate(MY_KEY, username)
    return flask.make_response("Hi {}".format(clear_username), 200)
...
...
def create_user(username):
    # username is a clear string
    save_to_database(username)
    return obfuscate(MY_KEY, username)

总而言之,混淆需要简单但足够好,以至于你无法通过查看 URL 来弄清楚它,并且是双向的,这样我就可以弄清楚原始字符串是并打印出来。

我最终用 itsdangerous 解决了这个问题,它是 Flask 的一个依赖项,所以无论如何我都有它在我的服务器上。

如示例 here 所示:

>>> from itsdangerous import URLSafeSerializer
>>> s = URLSafeSerializer('secret-key')
>>> s.dumps([1, 2, 3, 4])
'WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo'
>>> s.loads('WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo')
[1, 2, 3, 4]

可以肯定的是,我不会像文档字符串所说的那样感到惊讶:

Works like :class:Serializer but dumps and loads into a URL safe string consisting of the upper and lowercase character of the alphabet as well as _, - and ..