为何篡改Flask Session Cookie后重新签名需使用原密钥?
Flask Session Cookie的核心机制
Flask采用客户端存储式Session:Session数据并非存放在服务器,而是经签名后存储在用户浏览器的Cookie中。这里要明确两个关键点:
- 数据本身仅做了base64编码序列化,未加密,所以无需密钥就能解码出明文;
- Cookie末尾的HMAC签名是服务器用专属密钥生成的,核心作用是验证数据是否被篡改。
解码无需密钥的原因
你使用工具解码的是Cookie的数据部分,这个过程只是还原base64编码的序列化内容,和密钥无关:
python flask_session_cookie_manager3.py decode -c ".eJwtjkGKAzEMBL-S9TkHy5Yte96wP1jCIEvyJmxIYDxzCvn7-pBTUw1N18ut_c7jasMtPy932me4cYjYGO7svp-_t8fpw_24f7nL-3Kem83G1S37dtikm7rFQUJBRSOL1GKWVCoRC3ED7VAz9FKsVi9aO2RgJmgSi88VuQCmXghjaRZjSCqBDTm3qE1LAh8bGnuG3jAHCV4iZlAoPkhiAGghT9v1GLZ9bCbK2Pq6P__sMQuev2ZcKQFkMinJWhRSqB4hYyWv2oWre_8D5vtQyA.ZTUbZQ.erv_yZmYg44tiaJ0u8fqKailHUc"
解码结果:
b'{"_flashes":[{ " t":["success","Login successful!"]}],"_fresh":true,"_id":"154c4d4e7e37b36c58977ac7ab1df1961f88e990cd9f161aa71bc380694a8145f87438be3325dc2ae4a6b3dbd85103b4ea0a1fb462c20c3461d1802c5a111b26","_user_id":"1","csrf_token":"acd9eea9751167ec85eb3c7d1904164970ddfca9"}'
重新签名必须用原密钥的原因
当你篡改Session数据后,必须重新生成HMAC签名,而服务器验证Cookie的逻辑是:
- 提取Cookie中的数据部分,用自身保存的原密钥重新计算HMAC;
- 将计算出的HMAC与Cookie携带的签名做比对;
- 只有两者完全匹配,服务器才会认定数据合法未被篡改,否则直接拒绝该Cookie。
简单来说,签名是服务器确认“数据由我生成、未被篡改”的凭证,不用原密钥生成的签名,服务器计算出的结果必然和你提供的签名不一致,自然不会认可你篡改后的Cookie。
内容的提问来源于stack exchange,提问作者b3nguang
相关产品推荐
相关产品推荐

