想一个事情. 你在银行取钱或者办卡的时候. 我们都要输入密码. 那这个密码如果就按照我们输入的那样去存储. 是不是很不安全啊. 如果某一个程序员进入到了银行的数据库. 而银行的数据库又存的都是明文(不加密的密码)密码. 这时, 整个银行的账户里的信息都是非常非常不安全的. 那怎么办才安全呢? 给密码加密. 并且是不可逆的加密算法. 这样. 即使获取到了银行的账户和密码信息. 对于黑客而言都无法进行破解. 那我们的账号就相对安全了很多. 那怎么加密呢? 最常⻅的就是用MD5算法.
MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写这一套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作
1 import hashlib 2 3 obj = hashlib.md5() 4 obj.update("123456".encode("utf-8")) # 加密的必须是字节 5 miwen = obj.hexdigest() 6 print(miwen) #e10adc3949ba59abbe56e057f20f883e
那这样的密文安全么?其实是不安全的.当我们用这样的密文去找一个所谓的MD5解密工具.是有可能解密成功的.
这就尴尬了.MD5不是不可逆么?注意.这里有个撞库的问题.就是,由于MD5的原始算法已经存在很久了,那就有一些人用一些简单的排列组合来计算MD5. 然后当出现相同的MD5密文的时候就很容易反推出原来的数据是什么.所以并不是MD5可逆, 而是有些别有用心的人把MD5的常见数据已经算完并保留起来了.
那如何应对呢? 加盐就行了. 在使用MD5的时候. 给函数的参数传递一个byte即可.
1 import hashlib 2 3 obj = hashlib.md5(b"fjlksajflvbcvbsdfkjasfsalwer123dfskjf") # 加盐 4 obj.update("123456".encode("utf-8")) # 加密的必须是字节 5 miwen = obj.hexdigest() 6 print(miwen) # fd23725d0e0170df9104bdac09f92933
此时你再去任何网站去试,累死他也解不开密
那MD5如何应用呢?
1 import hashlib 2 3 4 def my_md5(s): 5 obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf") 6 obj.update(s.encode("utf-8")) # 加密的必须是字节 7 miwen = obj.hexdigest() 8 return miwen 9 10 11 # 123456: 2a596381e4d0f4e1fe4e3d5f864213ff 12 username = input("请输入用户名:") 13 password = input("请输入密码:") 14 # 数据存储的时候. 15 # username: my_md5(password) 16 # 假设现在的用户名和密码分别是 17 # abc: 2a596381e4d0f4e1fe4e3d5f864213ff ==> abc: 123456 18 # 用户登录 19 if username == "abc" and my_md5(password) == "2a596381e4d0f4e1fe4e3d5f864213ff": 20 print("成功") 21 else: 22 print("失败")
所以. 以后存密码就不要存明文了. 要存密文. 安全, 并且. 这里加的盐不能改来改去的.否则, 整套密码就都乱了.