1.编写加密文件 encrypt.py ,这里盐可以直接使用 settings 配置文件里的 'SECRET_KEY':
from django.conf import settings
import hashlib
def md5(data_string):
obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8')) # 加盐
obj.update(data_string.encode('utf-8'))
return obj.hexdigest()
加盐:指的是在哈希过程中添加额外数据以增强哈希值的安全性,这里的 'settings.SECRET_KEY' 就是用作盐的一种方式。
加盐的目的:
- 增加唯一性:即使两个不同的输入字符串经过哈希处理后得到了相同的哈希值,使用盐(如 'SECRET_KEY')可以确保这两个字符串的哈希值不同。这样,即使有人知道了原始数据的哈希值,没有盐的情况下,他们也无法轻易找到原始数据。
- 抵抗彩虹表攻击:彩虹表是一种预计算哈希值的攻击手段,通过使用随机生成的盐值,可以避免攻击者使用这些表来快速破解哈希值。
- 增强安全性:在某些情况下,简单地使用数据的哈希值是不可取的,特别是当涉及敏感数据时。通过结合盐值如 'SECRET_KEY'),可以增加破解的复杂性和时间成本。
2.定义一个 django 表单类,用来演示加密效果:
from django import forms
from app01.utils.bootstrap import BootStrapModelForm
from django.core.exceptions import ValidationError
from app01.utils.encrypt import md5
class AdminModelForm(BootStrapModelForm):
confirm_password = forms.CharField(
label="确认密码",
widget=forms.PasswordInput, # 密码不显示
)
class Meta:
model = models.Admin
fields = ["username", "password", "confirm_password"]
widgets = {
"password": forms.PasswordInput
}
# 密码加密(MD5码)
def clean_password(self):
pwd = self.cleaned_data.get("password")
return md5(pwd)
def clean_confirm_password(self):
pwd = self.cleaned_data.get("password")
confirm = md5(self.cleaned_data.get("confirm_password"))
if confirm != pwd:
raise ValidationError("密码不一致")
# 返回什么,此字段以后保存到数据库就是什么
return confirm
这里密码我输入的是 '12345',可以看到已添加到表单中去了:
可以看到,密码已加密成功:
到数据库中查看,也可以看到密码已加密成功: