v8_Python-hashlib加密

Python-hashlib加密

目录:

  • Python-hashlib加密
    • HASH
      • HASH的介绍
      • HASH的应用
    • MD5
      • 什么是MD5算法?
      • MD5功能
      • MD5算法的特点
      • MD5算法不可逆
      • MD5算法的用途
        • 1.防止被篡改
        • 2.防止直接看到明文
        • 3.防止抵赖(数字签名)
    • SHA-1
    • MD5与SHA-1的比较
    • Python提供的相关模块
    • 自定义加密模块

HASH

HASH的介绍

Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

HASH的应用

HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值.也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系

MD5

什么是MD5算法?

MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。MD5的前身有MD2、MD3和MD4。

MD5功能

  1. 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
  2. 不同的输入得到的不同的结果(唯一性);

MD5算法的特点

  1. 压缩性:任意长度的数据,算出的MD5值的长度都是固定的
  2. 容易计算:从原数据计算出MD5值很容易
  3. 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
  4. 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5算法不可逆

MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。

MD5算法的用途

1.防止被篡改
  • 比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。
  • 比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。
2.防止直接看到明文

现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。

  • 比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
3.防止抵赖(数字签名)

这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

SHA-1

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。

SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码散列函数。

由于MD5和SHA-1于2005年被山东大学的教授王小云破解了,科学家们又推出了SHA224, SHA256, SHA384, SHA512,当然位数越长,破解难度越大,但同时生成加密的消息摘要所耗时间也更长。目前最流行的是加密算法是SHA-256 .

MD5与SHA-1的比较

由于MD5与SHA-1均是从MD4发展而来,它们的结构和强度等特性有很多相似之处,SHA-1与MD5的最大区别在于其摘要比MD5摘要长32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5是2128数量级的操作,SHA-1是2160数量级的操作。产生具有相同摘要的两个报文的难度:MD5是264是数量级的操作,SHA-1 是280数量级的操作。因而,SHA-1对强行攻击的强度更大。但由于SHA-1的循环步骤比MD5多80:64且要处理的缓存大160比特:128比特,SHA-1的运行速度比MD5慢。

Python提供的相关模块

Python的 提供的相关模块
用于加密相关的操作,3.x里用hashlib代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

# md5
import hashlib
hash = hashlib.md5()  # 创建md5()加密实例
hash.update(bytes('admin', encoding='utf-8'))  # 对admin字符进行加密
print(hash.hexdigest())  # 返回产生的十六进制的bytes
print(hash.digest())

# sha1

hash = hashlib.sha1()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

# sha256

hash = hashlib.sha256()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

# sha384

hash = hashlib.sha384()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

# sha512

hash = hashlib.sha512()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())


# 哈希对象有以下方法:
# update(arg):使用arg中的字节更新哈希对象,重复调用等同于讲所有参数连接起来的单个调用
# digest():返回到目前为止传递给update()方法的字节摘要
# hexdigest():与digest()类似,不同的是,摘要作为双长度的unicode对象返回,只包含十六进制数字
# copy():返回哈希对象的副本(克隆),这可以用来有效地计算共享公共初始子字符串的字符串摘要

自定义加密模块

import hashlib
def get_md5(data):
    '''
    登录加密,将传入的密码进行加密处理,并返回值。
    :param data: 用户的密码
    :return: 返回MD5加密后的密码
    '''
    obj = hashlib.md5('abclasjd;flasdkfhowheofwa123113'.encode('utf-8')) #这里加盐
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result

def seve_user(username,password):
    '''
    将加密后的密码和用户名进行保存,以| 来分割,文件为test.txt
    :param username: 需要创建的用户名
    :param password: MD5后的密码
    :return: 需要更改的地方,return判断是否保存成功。
    '''
    user_list = [username,get_md5(password)]
    lis = '|'.join(user_list)
    with open('test.txt',encoding='utf-8',mode='a')as f:
        f.write(lis+'\n')

def read_user(username,password):
    '''
    来判断用户登录所输入的用户名和是否正确。
    :param username: 用户输入的用户名
    :param password: MD5加密后的密码
    :return: 如果匹配返回True
    '''
    with open('test.txt',mode='r',encoding='utf-8') as f:
        for item in f:
            infomation = item.strip()
            user,pwd = infomation.split('|')
        if username == user and password == pwd:
            return True
print(read_user)

while True:
    '''
    循环需要创建的用户
    '''
    user =input('请输入用户名:')
    if user.upper() == 'N':
        break
    pwd = input('请输入密码:')
    if len(user) and len(pwd) < 8:
        print('用户名密码不符合要求,请重新输入。')
    else:
        seve_user(user,pwd)
while True:
    '''
    循环用户登录
    '''
    user_name = input('请输入用户名:')
    password = input('请输入密码:')
    start_user = read_user(user_name,get_md5(password))
    if start_user:
        print('登录成功')
        break
    else:
        print('登录失败')

升级版:

import hashlib


def get_md5(data):
    obj = hashlib.md5('abclasjd;flasdkfhowheofwa123113'.encode('utf-8'))  # 这里加盐
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result


def seve_user(username, password):
    user_list = [username, get_md5(password)]
    lis = '|'.join(user_list)
    with open('test.txt', encoding='utf-8', mode='a')as f:
        f.write(lis + '\n')


def read_user(username, password):
    with open('test.txt', mode='r', encoding='utf-8') as f:
        for item in f:
            infomation = item.strip()
            user, pwd = infomation.split('|')

            if username == user and password == pwd:
                return True


def check_user(username):
    with open("test.txt", 'r', encoding='utf-8') as fp:
        for userInfo in fp:
            return True if username in userInfo.split("|") else False


def register():
    username = input('请输入用户名:')
    password = input('请输入密码:')
    if len(username) and len(password) < 8:
        print('用户名密码不符合要求,请重新输入。')
    else:
        if check_user(username):
            print("Username already in database!")
        else:
            seve_user(username, password)


def login():
    user_name = input('请输入用户名:')
    password = input('请输入密码:')
    start_user = read_user(user_name, get_md5(password))
    if start_user:
        print('登录成功')
        return True
    else:
        print('登录失败')
        return False


if __name__ == '__main__':
    while True:
        print("Hello!\n1.Register\n2.Login")
        command = input("Please input command:")
        if command == "1":
            register()
        elif command == "2":
            if login():
                print("Go to Home Page")
                break

你可能感兴趣的:(笔记,python)