将用户秘密加密存储到数据库中。
项目描述
将用户秘密加密存储到数据库中。
当前项目状态:"测试版"
许可证:GPL v3或以上
想法
使用密码加密将用户的秘密存储在数据库中。
只有用户可以解密存储的数据。他的密码用于加密和解密。此密码仅在登录时以纯文本形式传输(Django本身只保存密码的盐值散列)。
在登录成功后,中间用户秘密将被解密并存储在RAM中的明文密码中。所有用户秘密都将使用他的中间用户秘密进行加密和解密。
限制和/或事实
只有相同用户可以解密自己的数据。
解密的数据只能在活动会话中使用。
使用中间用户秘密,因此可以在不丢失加密数据的情况下更改密码。
用法
加密的用户秘密通过 EncryptedField 存储在用户模型中。您的项目必须实现一个继承自 AbstractUserSecretsModel 的自己的 settings.AUTH_USER_MODEL,例如。
/your_project/your_app/models.py
from user_secrets.model_fields import EncryptedField from user_secrets.models import AbstractUserSecretsModel class UserSecretsModel(AbstractUserSecretsModel): example_secret = EncryptedField(max_length=256, blank=True, null=True) # can have one or more EncryptedField's!
将此自定义用户模型添加到Django Admin中,并添加自己的 EncryptedField,例如,以便用户可以在admin中填写它。
/your_project/your_app/admin.py
from django.contrib import admin from django.utils.translation import gettext_lazy as _ from user_secrets.admin import UserSecretsAdmin from user_secrets_tests.models import UserSecretsModel @admin.register(UserSecretsModel) class ExampleModelAdmin(UserSecretsAdmin): fieldsets = ( (None, {'fields': ('username', 'password')}), (_('User Secrets'), {'fields': ('encrypted_secret', 'example_secret')}), # <<< own fields (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), (_('Permissions'), { 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'), }), (_('Important dates'), {'fields': ('last_login', 'date_joined')}), )
还可以实现一个仅针对 EncryptedField 值的“编辑”视图。查看示例应用视图: /user_secrets_tests/views/edit.py 对于此,您可以轻松获取 模型表单,例如。
from user_secrets.forms import UserSecretsBaseModelModelForm from user_secrets_tests.models import UserSecretsModel class ExampleModelForm(UserSecretsBaseModelModelForm): class Meta: model = UserSecretsModel fields = ['example_secret']
在视图中使用存储的密钥,例如。
user = request.user # get current user example_secret = user.example_secret # the the example field value (encrypted) # decrypt the example decrypted_value = user_decrypt(user=user, encrypted_data=example_secret) # ...do something with the value...
完整示例是: /user_secrets_tests/views/display.py
所需设置
# The SECRET_KEY should never changed after django-user-secrets are created! SECRET_KEY = 'Use a long random string and keep this value secret!' INSTALLED_APPS = ( #... 'user_secrets.apps.UserSecretsConfig', #... ) # Must point to a own UserModel class # This class must inherit from user_secrets.models.AbstractUserSecretsModel AUTH_USER_MODEL = 'your_app.YourUserModel' AUTHENTICATION_BACKENDS = [ 'user_secrets.auth_backend.UserSecretsAuthBackend', # Must be at first 'django.contrib.auth.backends.ModelBackend' ] CACHES = { 'default': { # Can use any backend. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'default', }, 'user_secrets': { # Should be use the LocMemCache! 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'user_secrets', } } MIDDLEWARE = ( #... 'user_secrets.middleware.UserSecretsMiddleware', # inserted after AuthenticationMiddleware )
DEMO
准备: 安装 poetry 例如。
~$ sudo apt install python3-pip ~$ pip3 install -U pip --user ~$ pip3 install -U poerty --user
克隆源代码,例如。
~$ git clone https://github.com/jedie/django-user-secrets.git ~$ cd django-user-secrets # install via poetry: ~/django-user-secrets$ poetry install # Start Django dev. server: ~/django-user-secrets$ poetry run dev_server
您还可以使用我们的 Makefile,例如。
~/django-user-secrets$ make help help List all commands install-poetry install or update poetry install install django-user-secrets via poetry update update the sources and installation lint Run code formatters and linter fix-code-style Fix code formatting tox-listenvs List all tox test environments tox Run pytest via tox with all environments tox-py36 Run pytest via tox with *python v3.6* tox-py37 Run pytest via tox with *python v3.7* tox-py38 Run pytest via tox with *python v3.8* pytest Run pytest update-rst-readme update README.rst from README.creole publish Release new version to PyPi start-dev-server Start Django dev. server with the test project
历史记录
-
TBC
-
重构
将 EncryptedFields 移入用户模型,并不要为它们使用额外的模型
将代码部分从示例应用移入主包
更新示例应用
更新 README
修复 Makefile 错误
-
首次发布于 PyPi
注意:此文件由 README.creole 生成于 2020-07-06 11:30:39,使用 "python-creole"
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。