Я создал одно приложение Django с настройками ниже - (для базового сеанса cookie)

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

Затем я получил идентификатор сеанса

sessionid=.eJxrYJk6gwECaqdo9PDGJ5aWZMSXFqcWxWemTOlhMjSY0iOEJJiUmJydmgeU0UzJSsxLz9dLzs8rKcpM0gMp0YPKFuv55qek5jjB1PIjGZCRWJwxpUfDMNUk1STJ1MLc0tLczDLNyMg0ydDQzDTJzCjZ0jg50SLR3NDc3DzReEqpHgBcETf7:1eVt50:xtWtUp9mwcxusxtg6fZB_tHzlYw

С другой настройкой (для сезонов с поддержкой базы данных)

SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

Я получил зашифрованную строку в базе данных:

gzc9c9nwwraqhbdsk9xg935ypkqp7ecs|MmExZWI0NjZjYzIwNDYyZDhjNWVmODJlNmMwNjI0ZmJmMjQ4MTljNDp7Il9hdXRoX3VzZXJfaWQiOiIxMCIsIl9hdXRoX3VzZXJfYmFja2VuZCI6ImRqYW5nby5jb250cmliLmF1dGguYmFja2VuZHMuTW9kZWxCYWNrZW5kIiwiX2F1dGhfdXNlcl9oYXNoIjoiMWU0ZTRiNTg3OTk3NjlmMjI1YjExNjViNjJjOTNjYThhNzE3NzdhMyIsImxhc3RfbG9naW4iOjIyMjJ9

Я хочу знать, что находится внутри обеих зашифрованных строк.

  1. Как я могу расшифровать оба?
  2. Какой алгоритм шифрования использует django для шифрования?
  3. Где я могу установить алгоритмы шифрования?

Было бы здорово, если бы кто-нибудь мог дать мне образец кода.

1
melvinjose 1 Янв 2018 в 09:13

2 ответа

Лучший ответ

Документацию о подписании значений с помощью секретного ключа можно найти по адресу: https://docs.djangoproject.com/en/2.0/topics/signing/

Глядя на строку идентификатора сеанса, которая выглядит как сложное значение: https://docs.djangoproject.com/en /2.0/topics/signing/#protecting-complex-data-structures

>>> 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 / и как реализовать собственный сериализатор / хранилище

1
MultiSkill 1 Янв 2018 в 07:35

Во-первых, я бы не рекомендовал вам использовать PickleSerializer, если у вас нет веской причины изменить сериализатор сеанса по умолчанию и понять последствия для безопасности.

Файлы cookie, которые у вас есть, не зашифрованы, они просто закодированы как безопасный для URL-адресов base64 (возможно, сжатые с помощью zlib), а затем подписаны:

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.'

Все это выполняется вашим { {X0}}:

from importlib import import_module
from django.conf import settings

SessionStore = import_module(settings.SESSION_ENGINE).SessionStore

session_data = SessionStore().decode('.eJxrYJk6gwECaqdo9PDGJ5aWZMSXFq......')
1
Blender 1 Янв 2018 в 06:34