首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中,如何用我的SECRET_KEY解密数据库和cookie中的会话id?

在Django中,如何用我的SECRET_KEY解密数据库和cookie中的会话id?
EN

Stack Overflow用户
提问于 2018-01-01 06:13:42
回答 2查看 3.6K关注 0票数 2

我创建了一个Django应用程序,设置如下-(用于cookie基会话)

代码语言:javascript
复制
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

然后我得到了一个会话标识

代码语言:javascript
复制
sessionid=.eJxrYJk6gwECaqdo9PDGJ5aWZMSXFqcWxWemTOlhMjSY0iOEJJiUmJydmgeU0UzJSsxLz9dLzs8rKcpM0gMp0YPKFuv55qek5jjB1PIjGZCRWJwxpUfDMNUk1STJ1MLc0tLczDLNyMg0ydDQzDTJzCjZ0jg50SLR3NDc3DzReEqpHgBcETf7:1eVt50:xtWtUp9mwcxusxtg6fZB_tHzlYw

使用另一个设置(用于数据库支持的sesisons)

代码语言:javascript
复制
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

我在数据库中得到了以下加密字符串:

代码语言:javascript
复制
gzc9c9nwwraqhbdsk9xg935ypkqp7ecs|MmExZWI0NjZjYzIwNDYyZDhjNWVmODJlNmMwNjI0ZmJmMjQ4MTljNDp7Il9hdXRoX3VzZXJfaWQiOiIxMCIsIl9hdXRoX3VzZXJfYmFja2VuZCI6ImRqYW5nby5jb250cmliLmF1dGguYmFja2VuZHMuTW9kZWxCYWNrZW5kIiwiX2F1dGhfdXNlcl9oYXNoIjoiMWU0ZTRiNTg3OTk3NjlmMjI1YjExNjViNjJjOTNjYThhNzE3NzdhMyIsImxhc3RfbG9naW4iOjIyMjJ9

我想知道两个加密的字符串里面是什么。

  1. 我怎么能把两者都解密呢?
  2. django使用哪种加密算法进行加密?
  3. 我可以在哪里设置加密算法?

如果有人能给我一个示例代码,那就太好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-01 07:35:33

有关使用秘密密钥对值进行签名的文档可以在:https://docs.djangoproject.com/en/2.0/topics/signing/找到。

查看类似于复杂值的会话id字符串:https://docs.djangoproject.com/en/2.0/topics/signing/#protecting-complex-data-structures

代码语言:javascript
复制
>>> from django.core import signing
>>> value = signing.dumps({"foo": "bar"})
>>> value
'eyJmb28iOiJiYXIifQ:1NMg1b:zGcDE4-TCkaeGzLeW9UQwZesciI'
>>> signing.loads(value)
{'foo': 'bar'}

所以试着做signing.loads(session_id)

但这也可能因为盐错了而失败。只要阅读有关Django会话的内容,就可以了解更多关于存储的信息。特别是https://docs.djangoproject.com/en/2.0/topics/http/sessions/和如何实现您自己的序列化程序/存储

票数 2
EN

Stack Overflow用户

发布于 2018-01-01 06:34:11

首先,我建议您不要使用PickleSerializer,除非您有充分的理由更改默认的会话序列化程序并理解对安全的影响

您没有加密的cookies,它们只是被编码为url安全的base64 (可选地用zlib压缩),然后签名:

代码语言:javascript
复制
In [8]: import base64

In [9]: base64.urlsafe_b64decode('MmExZWI0NjZjYzIwNDYyZDhjNWVmODJlNmMwNjI0ZmJmMjQ4MTljNDp7Il9hdXRoX3VzZXJfaWQiOiIxMCIsIl9hdXRoX3VzZXJfYmFja2VuZCI6ImRqYW5nby5jb250cmliLmF1dGguYmFja2V
  ...   uZHMuTW9kZWxCYWNrZW5kIiwiX2F1dGhfdXNlcl9oYXNoIjoiMWU0ZTRiNTg3OTk3NjlmMjI1YjExNjViNjJjOTNjYThhNzE3NzdhMyIsImxhc3RfbG9naW4iOjIyMjJ9')
Out[9]: '2a1eb466cc20462d8c5ef82e6c0624fbf24819c4:{"_auth_user_id":"10","_auth_user_backend":"django.contrib.auth.backends.ModelBackend","_auth_user_hash":"1e4e4b58799769f225b1165b62c93ca8a71777a3","last_login":2222}'

In [10]: base64.urlsafe_b64decode('.eJxrYJk6gwECaqdo9PDGJ5aWZMSXFqcWxWemTOlhMjSY0iOEJJiUmJydmgeU0UzJSsxLz9dLzs8rKcpM0gMp0YPKFuv55qek5jjB1PIjGZCRWJwxpUfDMNUk1STJ1MLc0tLczDLNyMg0ydDQz
   ...   DTJzCjZ0jg50SLR3NDc3DzReEqpHgBcETf7').decode('zlib')
Out[10]: '\x80\x04\x95\x98\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\r_auth_user_id\x94\x8c\x0210\x94\x8c\x12_auth_user_backend\x94\x8c)django.contrib.auth.backends.ModelBackend\x94\x8c\x0f_auth_user_hash\x94\x8c(1e4e4b58799769f225b1165b62c93ca8a71777a3\x94u.'

这都是由您的SESSION_ENGINE处理的。

代码语言:javascript
复制
from importlib import import_module
from django.conf import settings

SessionStore = import_module(settings.SESSION_ENGINE).SessionStore

session_data = SessionStore().decode('.eJxrYJk6gwECaqdo9PDGJ5aWZMSXFq......')
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48047548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档