实际要实现的功能,就是给每一个用户输入的内容都以用户的某个特征值,例如账号,邮箱,作为加密的秘钥,然后把加密后的内容储存在数据库中,目的是希望即便是数据管理员直接方案数据库也不知道用户输入了什么,然后只有当用户用自己的秘钥访问的时候,才能再前台看到它自己输入的内容
用的是Django,MySQL
小白一个。。求大神推荐个思路或方案案例。。。非常感谢
使用MySQL的MD5函数进行单向加密。
也可以使用MySQL的ENCRYPT函数进行单向加密,这个是可加盐的。
当然这些方式也可以直接在python代码中去实现,就是先进行加密,然后再存入数据库,解码也是一样。python中的pycrypto包可以提供ENCRYPT的单向加密,hashlib包的md5可以提供MD5单向加密
参考语句:
-- password在数据库中是加密存储的,无法双向破解。
-- MD5,不加盐
-- 插入密码
INSERT INTO table_user (username, password) VALUES ('Matt', MD5('mattpasswd'));
-- 验证密码是否正确
SELECT * FROM table_user WHERE username='Matt' AND password=MD5('mattpasswd');
-- ENCRYPT,使用用户名进行加盐加密
INSERT INTO table_user (username, password) VALUES ('Matt', ENCRYPT('mattpasswd', username));
SELECT * FROM table_user WHERE username='Matt' AND password=ENCRYPT('mattpasswd', username);
1.安装Fernet,用于django模型字段对称加密
pip install django-fernet-fields
2.用法示例
只需导入并使用模型中包含的字段类:
from django.db import models
from rbac.models import *
from fernet_fields import EncryptedCharField
class Customer(models.Model):
""" 客户(学生)表 """
name = EncryptedCharField(verbose_name='姓名', max_length=64)
gender_choices = (
(1, '男'),
(2, '女')
)
可以声明变量并和往常一样读取name字段的值,但是这些值在发送到数据库之前会自动进行加密,并在数据库中读取时进行解密。加密和解密都将在本地应用中执行,密钥永远不会发送到数据库服务器,数据库仅查看此字段的加密值。
另外由于Fernet加密不是确定性的(使用相同密钥加密的相同源文本每次都会导致不同的加密令牌),因此索引或强制执行唯一性或对加密数据执行查找是无用的。每个加密值总是不同的,每次完全匹配查找都会失败; 其他查找的结果将毫无意义。
由于这个原因,如果通过了 db_index=True,unique=True,primary_key=True,EncryptedField
将抛出 django.core.exceptions.ImproperlyConfigured。并且对于 EncryptedField 的任何类型的查找。除了为空之外,都将抛出django.core.exceptions.FieldError。
加密方式就那么几种,用户还需要看到还原后的数据,那么就选择一种可逆的加密就行了。
帐号使用的时间很长,一般除了帐号其他的个人信息都可以修改。建议用帐号作为秘钥。
不建议将所有数据进行加密。密码使用不可逆加密,其他关键信息使用可逆加密。普通数据不加密。
使用 RSA加密