• day22- hashlib模块-摘要算法(哈希算法)


    # python的hashlib提供了常见的摘要算法,如md5(md5算法),sha1等等。摘要:digest
    # 摘要算法又称哈希算法、散列算法。
    # 它通过一个函数,把任意长度的数据(明文)转换为一个长度固定的数据串(密文)(通常用16进制的字符串表示)。
    # 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,
    # 目的是为了发现原始数据是否被人篡改过。摘要算法之所以能指出数据是否被篡改过,
    # 就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。
    # 而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
    # 要注意摘要算法虽然可以用于加密,但网上有很多可以解密的网站,存在一定的被破解的风险。
    # 一个明文对应唯一密文。常用于对比登录密码和存储在电脑的密码或网站密码(文件的一致性校验)。
    # 如果以明文保存用户口令(用户名或密码),如果数据库泄露,所有用户的口令就落入黑客的手里。黑客撞库。
    # 此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。
    # 正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如md5
    
    
    # 1.
    import hashlib
    md5 = hashlib.md5()#md5可改为sha1,比sha1更安全的算法是sha256和sha512,不过越安全的算法越慢,而且摘要长度更长。
    md5.update(b'136320') #b'136320'相当于'136320'.encode('utf-8')。
    print(md5.hexdigest())#d5d082d2642302fae506350fff337632,这是md5值,一个32位的16进制字符串。
    
    # 2.如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:
    import hashlib
    md5 = hashlib.md5()
    md5.update(b'13')
    md5.update(b'6320')#13跟6320叠加的md5值跟136320的md5值是一样的。
    print(md5.hexdigest())#d5d082d2642302fae506350fff337632
    # md5.update(b'136320')
    # print(md5.hexdigest())#d5d082d2642302fae506350fff337632
    
    # 3. 用户注册,密码是md5值:
    import hashlib
    username = input('username:')
    password = input('password:')
    md5 = hashlib.md5() #获取md5对象
    md5.update(bytes(password,encoding = 'utf-8')) #加密:md5.update密码。password.encode('utf-8')
    md5_pwd = md5.hexdigest() #获取md5值(密文)
    with open('username&password',mode = 'w',encoding = 'utf-8') as f:
        f.write('%s&%s'%(username,md5_pwd))
    
    
    # 4. 用户登录验证:
    import hashlib
    username = input('username:')
    password = input('password:')
    with open('username&password',encoding = 'utf-8') as f:
        for line in f:
            user,pwd = line.split('&')
        md5 = hashlib.md5()
        md5.update(bytes(password,encoding='utf-8'))
        #要写上encoding='utf-8',不然会抛出string argument without an encoding
        md5_pwd = md5.hexdigest()
        if username == user and md5_pwd == pwd:
            print('登录成功')
        else:
            print('账户或密码不对')
    
    # 5. 加盐:经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令,但也存在一定的被破解的风险。
    import hashlib
    md5 = hashlib.md5(bytes('salt',encoding = 'utf-8'))#salt可以是任意字符。
    md5.update(b'136320')
    print(md5.hexdigest())#dc740385c07799eefb7c1f1ae24050ee
    # 加了盐之后,md5值跟原来的d5d082d2642302fae506350fff337632不一样。
    
    #盐后面还可以加其他字符:b'123'
    import hashlib
    md5 = hashlib.md5(bytes('salt',encoding = 'utf-8') + b'123')
    md5.update(b'136320')
    print(md5.hexdigest())
  • 相关阅读:
    详解JavaScript中的this
    java静态代理与动态代理简单分析
    BZOJ1263 [SCOI2006]整数划分
    BZOJ1258 [CQOI2007]三角形
    BZOJ1237 [SCOI2008]配对
    BZOJ1257 [CQOI2007]余数之和
    BZOJ1103 [POI2007]大都市
    BZOJ1061 [NOI2008]志愿者招募
    BZOJ1050 [HAOI2006]旅行
    BZOJ1055 [HAOI2008]玩具取名
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/11304126.html
Copyright © 2020-2023  润新知