跳转到主要内容

将用户秘密加密存储到数据库中。

项目描述

将用户秘密加密存储到数据库中。

Build Status on github

github.com/jedie/django-user-secrets/actions

当前项目状态:"测试版"

许可证: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
)

完整示例是: /user_secrets_tests/settings.py

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

历史记录

  • *dev*

    • TBC

  • v0.2.0 - 06.07.2020

    • 重构

      • 将 EncryptedFields 移入用户模型,并不要为它们使用额外的模型

      • 将代码部分从示例应用移入主包

    • 更新示例应用

    • 更新 README

    • 修复 Makefile 错误

  • v0.1.0 - 04.07.2020

    • 首次发布于 PyPi


注意:此文件由 README.creole 生成于 2020-07-06 11:30:39,使用 "python-creole"

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

django-user-secrets-0.2.0.tar.gz (21.9 kB 查看散列)

上传时间 源代码

构建分发

django_user_secrets-0.2.0-py3-none-any.whl (30.3 kB 查看散列)

上传时间 Python 3

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面