Skip to main content

Save field value encrypted to database.

Project description

django-safe-fields

Save field value encrypted to database.

Install

pip install django-safe-fields

Shipped Fields

Mixins

  • SafeFieldMixinBase
  • SafeStringFieldMixin
  • SafeNumbericFieldMixinBase # used for fields that using none numberic database backend

Fields & Instance Extra Init Parameters (You can use django's fields default parameters)

  • SafeCharField
    • password: default to settings.SECRET_KEY.
    • cipher_class: choices are cipherutils.AesCipher, cipherutils.S12Cipher or something similar. default to cipherutils.AesCipher.
    • kwargs
    • cipher: or you can provides cipher instance instead of cipher_class and class parameters. Has higher priority than cipher_class.
  • SafeTextField
    • Same as SafeCharField
  • SafeEmailField
    • Same as SafeCharField
  • SafeURLField
    • Same as SafeCharField
  • SafeGenericIPAddressField
    • Same as SafeCharField
  • SafeIntegerField
    • Note: no extra init parameters
  • SafeBigIntegerField # using varchar(max_length=128) in datatabase storage
    • password
    • kwargs
      • int_digits: default to 12
  • SafeFloatField # using varchar(max_length=128) in database storage.
    • password
    • kwargs
      • int_digits: default to 12
      • float_digits: default to 4

Note

  1. Default cipher class is MysqlAesCipher. It keeps the same with mysql's aes_encrypt and aes_decrypt when the mysql's server variable block_encryption_mode=aes-128-ecb. The main trick is the method used to prepair the final key from the password.
  2. Default password is settings.SECRET_KEY, but we STRONGLY suggest you use different password for every different field.

Usage

pro/settings.py

INSTALLED_APPS = [
    ...
    'django_safe_fields',
    ...
]
  1. Insert django_safe_fields into INSTALLED_APPS.

app/models.py

from django.db import models
from django.conf import settings
from django_safe_fields.fields import SafeCharField
from django_safe_fields.fields import SafeGenericIPAddressField
from django_safe_fields.fields import SafeIntegerField
from fastutils.cipherutils import S12Cipher
from fastutils.cipherutils import HexlifyEncoder

class Account(models.Model):
    username = SafeCharField(max_length=64)
    name = SafeCharField(max_length=64, cipher_class=S12Cipher)
    email = SafeCharField(max_length=128, null=True, blank=True, cipher=S12Cipher(password=settings.SECRET_KEY, encoder=HexlifyEncoder(), force_text=True))
    last_login_ip = SafeGenericIPAddressField(max_length=256, null=True, blank=True, password="THIS FIELD PASSWORD")
    level = SafeIntegerField(null=True, blank=True)

    def __str__(self):
        return self.username

  1. All fields will be stored with encryption.
  2. Aes is a strong cipher.
  3. With aes encryption, you can NOT search partly, only the exact search rule will be accepted.
  4. With aes encryption, you can NOT sort.
  5. S12Cipher is string encode method that keeps the sorting result after encoded.
  6. IvCihper is a week cipher for integer field that let you sort with the field.

Test Passed On Python and Django Versions

  • python27:~=django1.11.29
  • python34:~=django1.11.29
  • python34:~=django2.0.13
  • python35:~=django1.11.29
  • python35:~=django2.0.13
  • python35:~=django2.1.15
  • python35:~=django2.2.28
  • python36:~=django2.0.13
  • python36:~=django2.1.15
  • python36:~=django2.2.28
  • python36:~=django3.0.14
  • python36:~=django3.1.14
  • python36:~=django3.2.21
  • python37:~=django2.0.13
  • python37:~=django2.1.15
  • python37:~=django2.2.28
  • python37:~=django3.0.14
  • python37:~=django3.1.14
  • python37:~=django3.2.21
  • python38:~=django2.0.13
  • python38:~=django2.1.15
  • python38:~=django2.2.28
  • python38:~=django3.0.14
  • python38:~=django3.1.14
  • python38:~=django3.2.21
  • python38:~=django4.0.10
  • python38:~=django4.1.11
  • python38:~=django4.2.5
  • python39:~=django2.0.13
  • python39:~=django2.1.15
  • python39:~=django2.2.28
  • python39:~=django3.0.14
  • python39:~=django3.1.14
  • python39:~=django3.2.21
  • python39:~=django4.0.10
  • python39:~=django4.1.11
  • python39:~=django4.2.5
  • python310:~=django2.1.15
  • python310:~=django2.2.28
  • python310:~=django3.0.14
  • python310:~=django3.1.14
  • python310:~=django3.2.21
  • python310:~=django4.0.10
  • python310:~=django4.1.11
  • python310:~=django4.2.5
  • python311:~=django2.2.28
  • python311:~=django3.0.14
  • python311:~=django3.1.14
  • python311:~=django3.2.21
  • python311:~=django4.0.10
  • python311:~=django4.1.11
  • python311:~=django4.2.5

Releases

v0.2.3

  • 修正:mapping_cipher_fields_dumps与最新版本zenutils匹配的问题。

v0.2.2

  • Fix fastutils.strutils.force_text problem. Use zenutils.sixutils.TEXT instead.

v0.2.1

  • Fix problem with latest version of fastutils.

v0.1.11

  • Fix callable default value problem.

v0.1.7

  • Add used_ciphers parameters support, so that we can decrypt old data when we change cipher_class or field password.
  • Add safe field management commands: list_safe_fields, mapping_cipher_fields_dumps. Note: Use mapping_cipher_fields_dumps to speed up the safe field initialization.

v0.1.6

  • Fix xxx__in query problem.

v0.1.5

  • Turn to bytes before doing encryption.

v0.1.4

  • Change init parameter encoder to result_encoder.

v0.1.3

  • Fix get_db_prep_lookup problem.

v0.1.2

  • Add SafeBigIntegerField and SafeFloatField.

v0.1.1

  • Fix problem in objects.get that double encrypt the raw data.

v0.1.0

  • First release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-safe-fields-0.2.3.tar.gz (12.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_safe_fields-0.2.3-py3-none-any.whl (11.5 kB view details)

Uploaded Python 3

File details

Details for the file django-safe-fields-0.2.3.tar.gz.

File metadata

  • Download URL: django-safe-fields-0.2.3.tar.gz
  • Upload date:
  • Size: 12.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for django-safe-fields-0.2.3.tar.gz
Algorithm Hash digest
SHA256 9bb70282d6f7e3fc543835c0d82e5b59189cdab903f7ba6fd0a5b2044b2ee66b
MD5 391a2fbb918a4633b585bf7bd826f1be
BLAKE2b-256 7082478d21f205a202bd06a798c9dc69d2afb22e0fef6b954659132e39b7ecc5

See more details on using hashes here.

File details

Details for the file django_safe_fields-0.2.3-py3-none-any.whl.

File metadata

File hashes

Hashes for django_safe_fields-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 34123eb329c9e3f19c266b364f5abc6f4a04396e7b34199eda4c9b36efd7f5ab
MD5 e7094c45bae284d03929757d7e59f539
BLAKE2b-256 63a4d3f4d430426245ea3536e75244accb66ca216d2c78f41db849e06736ce9b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page