【问题标题】:does django encode passwords in the Database?django 对数据库中的密码进行编码吗?
【发布时间】:2023-04-30 20:54:01
【问题描述】:

我创建了一个密码为password123 的用户,但在数据库中,密码字段看起来像这样pbkdf2_sha256$260000$rJZWVrYXlokRG8fGMS1fek$S7Dm9soflUsy0Q74CJP8sB60tgfRWuRPdqj5XL0DBV0=

  • 问题:当我通过 rest 框架创建新用户时,我得到的 poassword feidl 看起来像 passsword123
  1. 那么我应该如何创建新用户以保留 django 密码编码功能
  2. 还有如何停用此密码编码功能

【问题讨论】:

    标签: django django-rest-framework django-rest-framework-simplejwt


    【解决方案1】:

    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 docencryption types and password management doc

    【讨论】:

      【解决方案2】:

      您需要在 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},
              }
      

      现在您的用户密码将作为散列密码保存在数据库中。

      【讨论】:

        【解决方案3】:

        重新。问题2。

        Django 不存储密码,只存储密码的哈希值,用于在用户登录时进行比较。

        不可能从这个哈希中对密码进行逆向工程(嗯,从数学上讲是可能的,但是您没有资源来运行该过程)。也不应该。

        如果您想要一个没有散列的密码字段,您可以只使用一个字符串字段。但是......不要这样做!它非常不安全。

        您无需知道用户的密码。

        至于问题 1,我不确定您为什么没有看到它经过哈希处理 - 您需要发布一些代码。

        【讨论】:

        • Django 出于安全原因将哈希密码存储在数据库中 from django.contrib.auth.hashers import make_password, check_password hashed_pwd = make_password("plain_text") check_password("plain_text",hashed_pwd) # 返回 True
        最近更新 更多