安全存储密码哈希django

时间:2013-08-22 00:57:45

标签: django authentication passwords password-protection

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

我的观点:

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[]的一部分。知道我做错了什么吗?我非常感谢有关正确实现这一点的一些帮助,以便散列传递。

由于

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

我有类似的问题。我的解决方案是在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,但我个人从未使用它。

答案 2 :(得分:0)

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

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 
        })