Discuss / Python / 注册成功之后登陆一直显示invalid password

注册成功之后登陆一直显示invalid password

Topic source

程程wcl

#1 Created at ... [Delete] [Delete and Lock User]

自己设置的密码到了数据库中就变成一长串字符,无论如何换密码均显示invalid password,找了authenticate没有发现问题,请问有谁可以帮忙解答一下吗

程程wcl

#2 Created at ... [Delete] [Delete and Lock User]

解决了!整整两天各种找bug,我真是被自己蠢哭了。看见报告信息里有下面的提示
Warning: (1265, "Data truncated for column 'passwd' at row 1)

才发现之前创建表的时候手贱把id和passwd长度改掉了,后来输入密码的时候长度不够就截断了,火速回去改表结构,以后再也不随随便便改代码了。

我之前也遇到了,不过原因不同,也是因为手贱:

@post('/api/users')
async def api_register_user(*, email, name, passwd):
    ********
    ********
    sha1_passwd = '%s: %s' % (uid, passwd)             # 在这一行冒号后面习惯性加了个空格...
    ********
    ********

之后在登陆检验密码的时候:

@post('/api/authenticate')async def authenticate(*, email, passwd):
    ********
    ********
    sha1 = hashlib.sha1()
    sha1.update(user.id.encode('utf-8'))
    sha1.update(b':')                                  # 这一行的冒号后面没有空格...
    sha1.update(passwd.encode('utf-8'))

导致传入的字符串不同,从而无法验证通过。

这里顺便简单说一下密码的加密过程:

在注册页面输入的密码,并没有直接传给 '/api/users',而是在html一端以 “邮箱:密码” 的形式进行了一次哈希加密,将密文作为passwd传给了 '/api/users':

                $form.postJSON('/api/users', {
                    name: this.name.trim(),
                    email: email,
                    passwd: CryptoJS.SHA1(email + ':' + this.password1).toString()      # 就是这里

接下来,密文并没有直接存进数据库,而是在python端再次以 “用户id:传入的密文” 的形式再次进行哈希加密:

uid = next_id()sha1_passwd = '%s:%s' % (uid, passwd)user = User(id=uid,
            name=name.strip(),
            email=email, passwd=hashlib.sha1(sha1_passwd.encode('utf-8')).hexdigest(),           # 就是这里            image='http://www.gravatar.com/avatar/%s?d=mm&s=120' % hashlib.md5(email.encode('utf-8')).hexdigest())

这一步之后,才将二次加密的结果存入数据库。

这也就解释了为什么我之前在冒号后多加了空格会导致的密码哈希值不匹配的问题。


  • 1

Reply