python 密码加盐学习笔记

python加盐Salt笔记

什么是加盐

    加盐通常指的是加盐加密,加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。无论何时只要口令改变,随机数就改变。随机数以未加密的方式存放在口令文件中,这样每个人都可以读。不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。

为什么需要加盐

    用户注册的密码一般网站管理人员会利用md5方法加密,这种加密方法的好处是它是单向加密的,也就是说,你只有在提前知道某一串密码对应的md5加密码,才能反推出密码是多少,虽然有极小的几率可能造成两个密码加密之后的值相等(这种现象称为碰撞),不过基本上不用担心,因为概率是极低的。在常用的hashlib模块里还有sha1()等方法,它的本质和md5是一致的,只是产生的结果是160 bit字节,通常用一个40位的16进制字符串表示。而md5是最常见的加密算法,生成速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
    但是,我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。
加盐(Salt)可以一定程度上解决这一问题。所谓加盐(Salt)方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。
    这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。这样,即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,但这个几率太小了(密码和salt值都得和黑客使用的一样才行)。
    所以,通过加盐,可以大幅提高MD5哈希算法的安全性,降低黑客对密码强行破解的可能。

加盐的方法

    简单来说,就是在hashlib模块中的md5加密方法时,传入一个你自己想给的盐,或者干脆随机生成(比较安全,将盐封装在类中)。

加盐算法的应用

    目前多家的网站程序公司都已经加入了该算法,如常见的VBB论坛、discuz论坛等都采用了,甚至著名的Linux开源操作系统早已经加入了这种加密模式。可得而知,这种算法势必会在未来应用于更多的范围。

python加盐的简单实现

# md5加密
import hashlib

# 先创建一个md5的对象
obj = hashlib.md5()
# 写入要加密的字节
obj.update("admin".encode("utf-8"))
# 获取密文
secret = obj.hexdigest()
print(secret)
# 其中md5加密是不可以进行反解码的,但是可以通过某些md5破解网站进行强行破解
# **********************************************************************
# MD5加盐加密

import hashlib

obj = hashlib.md5(b'12334')  # 实例化md5的时候可以给传入参数,这叫加盐,此时盐值为'1234'
obj.update("admin".encode("utf-8"))  # 是再加密的时候传入自己的一块字节,
secret = obj.hexdigest()
print(secret)
# **********************************************************************

# 因为用户密码已经被加密过了,而且是加盐的,所以再用户验证的时候用字符串或者直接的加密的的字节都不能正确判断
# 所以只能给密码加盐然后进行散列然后来判断

import hashlib

SALT = b'1234'  # 约定好要加的盐值,可以为任何值


def md5(pwd):
    # 实例化对象
    obj = hashlib.md5(SALT)
    # 写入要加密的字节
    obj.update(pwd.encode('utf-8'))
    # 获取密文
    return obj.hexdigest()



user = input("请输入用户名:")
pwd = input("请输入密码:")
print(md5(pwd))
if user == 'user' and md5(pwd) == 'ed2b1f468c5f915f3f1cf75d7068baae':  # 字符串为加盐之后散列后的MD5值
    print('登录成功')
else:
    print('登录失败')
没有账号? 忘记密码?

社交账号快速登录