验证“用户登录”的思路

正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要。如
果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。
此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。
第一步:当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存
储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。
第二步:计算用户输入的明文口令的MD5时,对其进行加盐,加盐一定要仔细考
虑好。

摘要算法能应用到什么地方?

举个常用例子: 任何允许用户登录的网站都会存储用户登录的用户名和口令。

如何存储用户名和口令呢?

方法是存到数据库表中:
name           password
michael        123456
bob            abc999
alice          alice2008
如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。
此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。

正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要

比如MD5:
username           password
michael            e10adc3949ba59abbe56e057f20f883e
bob                878ef96e86145580c38c87f0410ad153
alice              99b1c2188db85afee403b1536010c2c9
当用户登录时,首先计算用户输入的明文口令的MD5,
然后和数据库存储的MD5对比,如果一致,说明口令输入正确,
如果不一致,口令肯定错误。

采用MD5存储口令是否就一定安全呢?

这个不一定呢

假设你是一个黑客,已经拿到了存储MD5口令的数据库,如何通过MD5反推用户的明文口令呢? 暴力破解费事费力,真正的黑客不会这么干。
考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令, 于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表,这样的话便无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

反推表:
'e10adc3949ba59abbe56e057f20f883e': '123456'
'21218cca77804d2ba1922c33e0151105': '888888'
'5f4dcc3b5aa765d61d8327deb882cf99': 'password'

对于用户,应该怎么来减小口令被破解的风险呢?

当然不要使用过于简单的口令,建议设置密码时,使用数字、字母、特殊符合的组合

对于开发人员,我们能否在程序设计上对简单口令加强保护呢?

答案是肯定的,因为我们是攻城狮嘛

由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”。

def calc_md5(password):
    return get_md5(password + 'the-Salt')

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?

如果“假定用户无法修改登录名”,就可以通过把登录名作为Salt的一部分来计算MD5,
从而实现相同口令的用户也存储不同的MD5。
如果salt是我们自己随机生成的,通常我们计算MD5时采用md5(message + salt)。
但实际上,把salt看做一个“口令”,加salt的哈希就是:计算一段message的哈希时,
根据不通口令计算出不同的哈希。要验证哈希值,必须同时提供正确的口令。这实际上
就是Hmac算法:Keyed-Hashing for Message Authentication。它通过一个标
准算法,在计算哈希的过程中,把key混入计算过程中。和我们自定义的加salt算法不
同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自
己的salt算法,可以使程序算法更标准化,也更安全。
(自行学习hmac算法)

友情提醒

摘要算法在很多地方都有广泛的应用。但要注意摘要算法不是加密算法,不能用于加密,
因为无法通过摘要反推明文,只能用于防篡改,但是它的单向计算特性决定了可以在不
存储明文口令的情况下验证用户口令。

另一种常见的摘要算法是SHA1,SHA1和MD5类似。MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且摘要长度更长。

猜你喜欢

转载自blog.csdn.net/qq_34801506/article/details/79914100