zoukankan      html  css  js  c++  java
  • python之hashlib模块(MD5校验)

     示例:大文件md5校验

    def md5(fileMd5):
        import hashlib
        md5_value = hashlib.md5()
        with open(fileMd5,'rb') as f:
            while True:
           #每次读取2048个字节数据 data
    = f.read(2048) if not data: brea
           #计算md5值 md5_value.update(data) return md5_value.hexdigest()

     示例:密码加密

    本例我一个登录验证的装饰器

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    """
    功能:
        登录验证模块
    详细说明:
        1.密码文件为passwd
        2.passwd未创建或丢失,会提示:密码文件不存在,建议重新注册!!
        3.未注册用户登录会提示:用户名不存在,请您先进行注册!
        4.已注册用户登录时,忘记密码,尝试3次后密码还不正确则退出验证,等一会儿则可以重新登录
        5.作为装饰器进行登录验证
    """
    import json
    import hashlib
    import os
    pwd = os.getcwd()
    fileName = os.path.join(pwd,"passwd")
    
    #将明文密码通过md5进行加密,返回一个加密后的md5的值
    def calc_md5(passwd):
        md5 = hashlib.md5("haliluya")
        md5.update(passwd)
        ret = md5.hexdigest()
        return ret
    
    
    #新用户注册模块
    def register():
        #判断密码文件passwd是否存在,存在则载入列表,不存在就重新创建一个空字典
        if os.path.exists(fileName):
            #载入用户列表,数据结构为字典,k=userName,v=passwdMd5
            with open("passwd", "r+") as loadsFn:
                userDB = json.loads(loadsFn.read())
        else:
            userDB = {}
        #让用户输入用户名
        userName = raw_input("姓名:")
        #标志位:控制循环跳出
        flag = True
        while flag:
            #用户注册时,需输入两次密码
            passwd1 = raw_input("密码:")
            passwd2 = raw_input("确认密码:")
            #如果两次密码不一致,则不执行下一步,再次输入密码并进行确认
            if not passwd1 == passwd2:
                continue
            else:
                #两次输入密码一致,标志位置为False,下次跳出循环
                flag = False
            #调用calc_md5函数将明文密码转为对应的md5值,用于保存
            passwdMd5 = calc_md5(passwd1)
        #将用户名与密码对应存入字典userDB中
        userDB[userName] = passwdMd5
        #将用户名和密码存入文件
        with open(fileName, "w") as dumpFn:
            dumpFn.write(json.dumps(userDB))
    
    
    #用户登录验证,装饰器
    def login(func):
        def decorater(*args,**kwargs):
            #判断passwd文件是否存在,存在则载入userDB(用户:密码),否则就重新注册新的passwd文件并返回
            if os.path.exists(fileName):
                with open("passwd", "r+") as loadsFn:
                    userDB = json.loads(loadsFn.read())
            else:
                print "密码文件不存在,建议重新注册!!"
                register()
                return
    
            name = raw_input("用户名:")
            #用户名是否存在,存在就继续输入密码,不存在则进行注册
            if name in userDB.keys():
                flag = True
                counter = 0
                #循环输入密码,密码正确,flag=False(下次直接跳出循环)并执行函数,密码错误则允许尝试3次,超过3次验证失败,退出验证
                while flag:
                    passwd = raw_input("密码:")
                    passwdMd5 = calc_md5(passwd)
                    if passwdMd5 == userDB[name]:
                        flag = False
                        func(*args,**kwargs)
                    elif counter > 2:
                        print "您已经尝试了3次,请过会儿再试!!"
                        return
                    else:
                        counter += 1
            else:
                print "用户名不存在,请您先进行注册!"
                register()
        return decorater
    
    if __name__ == "__main__":
        @login
        def hello():
            print "Hello world!"
        hello()
  • 相关阅读:
    自动化基础知识
    第一章Google软件测试介绍
    《将博客搬至CSDN》
    二叉树的先序遍历和中序遍历分析(递归)
    java 部分快捷功能
    toString
    自增自减运算符剖析
    二进制数的直接表示
    编程中的&&和||
    npm 镜像地址设置
  • 原文地址:https://www.cnblogs.com/chbo/p/7074494.html
Copyright © 2011-2022 走看看