django 在数据库中对密码进行编码吗?
does django encode passwords in the Database?
我用密码 password123
创建了一个用户,但在数据库中,密码字段看起来像这样 pbkdf2_sha2560000$rJZWVrYXlokRG8fGMS1fek$S7Dm9soflUsy0Q74CJP8sB60tgfRWuRPdqj5XL0DBV0=
- 问题:当我通过 rest 框架创建新用户时,我得到的 poassword feidl 看起来像
passsword123
- 那么我应该如何创建新用户才能保持 django 密码编码功能
- 还有如何停用此密码编码功能
回复。问题 2.
Django 不存储密码,只存储密码的哈希值,用于用户登录时进行比较。
不可能从这个散列中逆向工程密码(好吧,从数学上讲这是可能的,但你没有 运行 这个过程的资源)。也不应该。
如果您想要一个未经哈希处理的密码字段,您可以只使用一个字符串字段。但是……不要这样做!它非常不安全。
您无需知道用户密码。
至于问题 1,我不确定您为什么没有看到它经过哈希处理 - 您需要 post 一些代码。
您需要在 User Create Serializer 中覆盖 create
方法:
class UserCreateSerializer(serializers.ModelSerializer):
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user
class Meta:
model = User
fields = "__all__" # or your specific fields
extra_kwargs = {
"password": {"write_only": True},
}
现在您的用户密码将作为散列密码保存在数据库中。
Django 使用加密中间件来加密密码(因为数据库将密码视为 VarChar 字段,所以 Django 的模型将它们视为纯文本,除非另有说明)。如果想让Django User模型使用加密,必须调用
user_obj.set_password(passwd_text)
通过这行代码,您告诉 Django 运行 加密算法。例如,在您的情况下,您可以先使用序列化程序的 extra_kwargs 从数据库可读数据中排除密码,然后创建用户。
class CreateUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['email', 'username', 'password']
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop("password")
user = User(**validated_data)
user.set_password(password)
user.save()
return user
如果您想了解更多关于 Django 用户和密码的信息,请阅读这些文档
user model doc 和
encryption types and password management doc
我用密码 password123
创建了一个用户,但在数据库中,密码字段看起来像这样 pbkdf2_sha2560000$rJZWVrYXlokRG8fGMS1fek$S7Dm9soflUsy0Q74CJP8sB60tgfRWuRPdqj5XL0DBV0=
- 问题:当我通过 rest 框架创建新用户时,我得到的 poassword feidl 看起来像
passsword123
- 那么我应该如何创建新用户才能保持 django 密码编码功能
- 还有如何停用此密码编码功能
回复。问题 2.
Django 不存储密码,只存储密码的哈希值,用于用户登录时进行比较。
不可能从这个散列中逆向工程密码(好吧,从数学上讲这是可能的,但你没有 运行 这个过程的资源)。也不应该。
如果您想要一个未经哈希处理的密码字段,您可以只使用一个字符串字段。但是……不要这样做!它非常不安全。
您无需知道用户密码。
至于问题 1,我不确定您为什么没有看到它经过哈希处理 - 您需要 post 一些代码。
您需要在 User Create Serializer 中覆盖 create
方法:
class UserCreateSerializer(serializers.ModelSerializer):
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user
class Meta:
model = User
fields = "__all__" # or your specific fields
extra_kwargs = {
"password": {"write_only": True},
}
现在您的用户密码将作为散列密码保存在数据库中。
Django 使用加密中间件来加密密码(因为数据库将密码视为 VarChar 字段,所以 Django 的模型将它们视为纯文本,除非另有说明)。如果想让Django User模型使用加密,必须调用
user_obj.set_password(passwd_text)
通过这行代码,您告诉 Django 运行 加密算法。例如,在您的情况下,您可以先使用序列化程序的 extra_kwargs 从数据库可读数据中排除密码,然后创建用户。
class CreateUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['email', 'username', 'password']
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop("password")
user = User(**validated_data)
user.set_password(password)
user.save()
return user
如果您想了解更多关于 Django 用户和密码的信息,请阅读这些文档 user model doc 和 encryption types and password management doc