【问题标题】:Securely store password hash django安全地存储密码哈希 django
【发布时间】:2013-08-22 00:57:44
【问题描述】:

目前我的应用程序在提交时正确存储了密码,但它没有经过哈希处理并且以明文形式存储。

我的看法:

def Registration(request):
    RegForm = RegistrationForm(request.POST or None)
    if request.method == 'POST':
        if RegForm.is_valid():
            clearUserName = RegForm.cleaned_data['userNm']   
            clearPassNoHash = RegForm.cleaned_data['userPass']
            clearPass = bcrypt.hashpw(clearPassNoHash.encode("utf-8"), bcrypt.gensalt(14) )
            RegForm.save()
            try:
                return HttpResponseRedirect('/Newuser/?userNm=' + clearUserName)
            except:
                raise ValidationError(('Invalid request'), code='300')    
    else:
        RegForm = RegistrationForm()

        return render(request, 'VA/reuse/register.html', {
            'RegForm': RegForm 
        })

表格

class RegistrationForm(ModelForm):
    userPass = forms.CharField(widget=forms.PasswordInput, label='Password')
    class Meta:
        model = Client
        fields = ['userNm','userPass']

models.py

class Client(models.Model):
    userNm = models.EmailField(verbose_name="Email",max_length=50,unique=True) #userNm = <user's email>
    userPass = models.CharField(verbose_name="Password", max_length=50)   

问题在于 clearPass 在视图中似乎只是发送 clearPassNoHash 的值,因为它的值是 .cleaned_data[] 的一部分。知道我做错了什么吗?对于正确实施此操作以散列通行证,我将不胜感激。

谢谢

【问题讨论】:

    标签: django authentication passwords password-protection


    【解决方案1】:

    您只是为变量赋值。您应该将其分配给表单:

        if RegForm.is_valid():
            clearUserName = RegForm.cleaned_data['userNm']   
            clearPassNoHash = RegForm.cleaned_data['userPass']
            RegForm.userPass = bcrypt.hashpw(clearPassNoHash.encode("utf-8"), bcrypt.gensalt(14) )
            RegForm.save()
    

    【讨论】:

    • 不幸的是,我试过这个 - 它提交表单,但表单包含未散列的明文密码。我也试过:userPassHashed = bcrypt.hashpw(RegForm.cleaned_data['userPass'].encode("utf-8"), bcrypt.gensalt(14) ) ,但这也没有用。有什么想法吗?
    【解决方案2】:

    我遇到了类似的问题。我的解决方案是在我的 models.py 中定义一个方法并调用该方法来散列我的纯文本密码。这是我的代码:

    #models.py
    def hash_password(password):
    #since our user model is from AbstractBaseUser, we need to manually hash passwords
        hashed = make_password(password) #returns PBKDF2 hashed password
        return hashed
    
    #views.py
    #encrypt plain password            
    form.instance.password = hash_password(clean['password'])
    

    您不必使用此(PBKDF2)散列算法,您可以使用您想要的任何一个(例如您的 Bcrypt 算法)。只要您返回散列值,您就应该很好。您可以使用的第二种解决方案是内置的set_password,但我个人从未使用过它。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,发现在提交之前实例化新用户可以解决我的问题:

      def Registration(request):
          RegForm = RegistrationForm(request.POST or None)
          if request.method == 'POST':
              if RegForm.is_valid():
                  new_user = RegForm.save(commit=False)
                  new_user.userNm = RegForm.cleaned_data['userNm']   
                  new_user.userPass = bcrypt.hashpw(
                      RegForm.cleaned_data['userPass'].encode("utf-8"), 
                      bcrypt.gensalt(14))
                  new_user.save()
                  try:
                      return HttpResponseRedirect('/Newuser/?userNm=' + clearUserName)
                  except:
                      raise ValidationError(('Invalid request'), code='300')    
          else:
              RegForm = RegistrationForm()
      
              return render(request, 'VA/reuse/register.html', {
                  'RegForm': RegForm 
              })
      

      【讨论】:

        猜你喜欢
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 2017-07-26
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 1970-01-01
        相关资源
        最近更新 更多