散列(哈希)函数的python实现。

本文介绍了网络安全的重要性,特别是账号密码保护。通过Python的hashlib库展示了如何使用哈希加密保护用户信息,防止数据库攻击。同时提到了区块链技术在安全防护中的应用,并提供了一个简单的登录验证程序示例,该程序使用哈希加密对数据库密码进行处理。作者还分享了对网络安全的思考,提出真伪信息的辨识问题。
摘要由CSDN通过智能技术生成

我感受现代科技和技术的进步,网络越来越成为生活不可或缺的一部分了,每个人都需要上网,我们也需要保护自己隐私。因此,网络安全问题,日益的加剧,网络诈骗,网络攻击手段也是层出不穷。我作为一个拉胯的计算机相关专业大学生,我觉得今天能在此跟大家分享一波个人的看法,是一件值得我高兴的事。

首先,我们在网络里面,最典型的就是账号和密码的保护。这是一件看似简单,实则不易的事,因为里面涉及的东西有很多方面。比如说,数据库攻击,脚本攻击,跨平台攻击等多方面的攻击。因为,我们用户的注册信息不可能存在一个单独数据表中,而是要存入数据库。因此,数据库的信息加密也成了一个问题,我们要实现,即便我们的防护机制被攻破了,数据库的信息也是无用的。不过,我们的用户在登录时,却要与数据库的信息进行连接对比,才会生效。

其次,现在我的学院开了区块链这门课,我觉得挺有意思的,就自学了,觉得区块链是一个不错的技术。应该能用于处理安全防护的问题。

最后,现在我所学的语言中,python是较为上手的语言,python中有相关的库,可以实现,这就是hashlib库。如果没有这个库的朋友,通过命令pip install hashlib来安装,如果,安装图中出现问题,可以更新pip,或者是连接清华源再安装。如果已经有了,则会提示
类似如下报错信息:在这里插入图片描述
现在,先举一个例子,文件内容的哈希加密,我用的是豆瓣书评,文件类型是txt类型。需要文件的朋友,可以跟我私聊,我发你文件。先打开文件,查看文件内容,如下代码:

import hashlib
h = hashlib.sha256()
with open(r'/home/pan/PycharmProjects/pythonProject/douban_book.txt','r+',encoding='utf-8') as f:
    lines = f.readlines()#读取全部内容
for line in lines:
    text = line.strip()#去除换行。
    print(text)#打印每一行的内容。

运行结果:
在这里插入图片描述
我们接着下一步,就是对文件内容进行加密,这里我选择用sha256()来加密,代码修改如下:

import hashlib
h = hashlib.sha256()
with open(r'/home/pan/PycharmProjects/pythonProject/douban_book.txt','r+',encoding='utf-8') as f:
    lines = f.readlines()
for line in lines:
    text = line.strip()
    print(text)
    h.update(text.encode())
    result = h.hexdigest()
    print('加密后:',result)

运行结果:
在这里插入图片描述
这就是哈希(散列)函数实现对文件内容的加密。

接下来,如果我们需要制作一个登陆验证的程序,那么就需要用到数据库了,我们要对数据库的密码加密,保证就算数据库遭受攻击,信息泄露也不会被人利用。实现效果,如下图:
在这里插入图片描述
在这里插入图片描述
这里,每个人的数据库密码都不一样,所以,大家只需要把数据库的密码修改一下,就可以运行以下代码,来实现上述功能了。这个是功能是用户输入密码后,会将密码转换成哈希值与数据库中注册的哈希值校对,校对成功就能登录,否则登录失败。就算数据库被攻击,密码也不会显示出来,只有哈希值。

代码:

#encoding="utf-8"
#Author:Mr.Pan_学狂
#finish_time:2020/10/9/23:43
#hashlib库(哈希库)/散列/单向加密,不能反向还原。

import pandas as pd
import hashlib#全局导入hashlib库
#import getpass
import os
def HS():
    h = hashlib.sha1()#创建哈希对象h
    s = 'hello world'
    s1 = 'hello'
    s2 = 'world'
    h.update(s.encode())
    print('h的结果是',h.hexdigest())
    print('h的长度是',len(h.hexdigest()))#以十六进制显示散列值
    h2 = hashlib.sha1(s1.encode())#将hello加入
    h2.update(s2.encode())#对hello world的解码
    print('h2的结果是',h2.hexdigest())
    print('h2的长度是',len(h2.hexdigest()))#结果h与h2的长度相同。
    if len(h.hexdigest()) == len(h2.hexdigest()):
        print('所以,h和h2的字符长度相同')
    else:
        print('h和h2的长度不同')
    print('h.digest',h.digest())#以字节形式显示h=shal("hello world")
    h.update(h.digest())#计算h=shal(shal("hello world"))
    print(h.hexdigest())#以十六进制显示h=shal(shal("hello world"))
    h3 = hashlib.sha1(b"hello world good night 1234567890987654321abc sanya2020")
    h4 = hashlib.sha1(b"hello world good night 123456789098765432iabc sanya2020")
    print('h3的结果是',h3.hexdigest())
    print('h4的结果是',h4.hexdigest())
    print('md5的结果是',hashlib.md5(b"root").hexdigest())
    print('sha1的结果是',hashlib.sha1(b"root").hexdigest())
    print('sha224的结果是',hashlib.sha224(b"root").hexdigest())
    print('sha256的结果是',hashlib.sha256(b"root").hexdigest())
    print('sha384的结果是',hashlib.sha384(b"root").hexdigest())
    print('sha512的结果是',hashlib.sha512(b"root").hexdigest())
    print('sha3_224的结果是',hashlib.sha3_224(b"root").hexdigest())
    print('sha3_256的结果是',hashlib.sha3_256(b"root").hexdigest())
    print('sha3_384的结果是',hashlib.sha3_384(b"root").hexdigest())
    print("sha3_512的结果是",hashlib.sha3_512(b"root").hexdigest())
#HS()#调用函数

#连接mysql数据库
def connect_mysql():
    import pymysql
    return pymysql.connect(
        host = '127.0.0.1',#主机号(本地)
        user = 'root',#数据库用户名
        password = '123456',#数据库密码
        port = 3306,#端口
        database = 'userinfo',#数据库名称
        charset = 'utf8'#字符集
    )

#更新插入数据到数据库
def insert_or_update(sql):
    connect = connect_mysql()#创建连接对象
    try:#调试数据库连接和写入操作
        cursor = connect.cursor()#创建游标对象
        cursor.execute(sql)#游标执行数据库语句
        connect.commit()#点击确认信息
        cursor.close()#关闭游标
    except Exception:#出现异常
        print('出现异常!!插入失败!!')
    finally:#最后
        connect.close()

def EXE():
    dt = dict()#创建一个字典用于存储信息,方便查询数据.
    while True:#创建一个可以控制的死循环
        print('--------------------')
        print('     1.用户注册      ')
        print('     2.用户信息查询      ')
        print('     3.用户登录 ')
        print('     4.退出程序 ')
        print('--------------------')
        Input = str(input('请选择您要进行的操作:'))
        if Input == '1':
            name = str(input('请输入您的用户名:'))
            db_name = "'"+name+"'"#数据库要插入姓名
            password = str(input('请输入您的密码:'))#未加密前的密码
            h = hashlib.sha1()#创建哈希对象
            h.update(password.encode())#进行哈希加密
            password2 = h.hexdigest()
            db_password = "'"+password2+"'"#数据库要插入密码
            dt[name] = password2#方便统计
            sql = "insert into info(username,password)values("+db_name+","+db_password+");"#构造sql语句
            #print(sql)#可视化sql语句
            print('插入数据成功!!')#显示插入结果
            insert_or_update(sql)
        elif Input == '2':
            connect = connect_mysql()
            cursor = connect.cursor()
            sql = 'select * from info;'
            cursor.execute(sql)
            data = cursor.fetchall()
            u = 0
            p = 1
            if data != ():
                count = 0
                print('username | password')
                print('---------+-----------------------------------------')
                for i in data:
                    count = count + 1
                    print(i[u]+(9-(len(i[u])+1))*' '+' | '+i[p])
                    #print('Password:',i[p])
                    #for e in i:
                        #print(e)
                print('总计:','有' + str(count) + '条用户信息')
            elif data == ():
                print('数据表中没有信息,请先注册!!')
            #print(data)
        elif Input == '3':
            connect = connect_mysql()
            cursor = connect.cursor()
            sql = 'select * from info;'
            cursor.execute(sql)
            data = cursor.fetchall()
            Username = str(input('请输入用户名:'))
            U = 0
            P = 1
            Dt = dict()
            for d in data:
                Dt[d[U]] = d[P]
            #print(Dt)
            #for k in Dt.keys():
                #print(k)
                #print(Dt[k])
            #for k in Dt.keys():
            if Username in Dt.keys():
                #input = getpass.getpass("Please input your password:")
                Password = str(input('请输入密码:'))
                h = hashlib.sha1()  # 创建哈希对象
                h.update(Password.encode())  # 进行哈希加密
                Password2 = h.hexdigest()
                if Password2 == Dt[Username]:
                    print('登录成功!!')
                    continue
                elif Password2 != Dt[Username]:
                    print('用户名或密码错误!!请重试!!')
                    continue
            elif Username not in Dt.keys():
                print('没有找到此用户信息,请注册!!')
                continue
        elif Input == '4':
            print('退出程序!!')
            break
        else:
            print('输入错误!!请重输!!')

if __name__ == '__main__':#创建主函数,程序出口,调用函数。
    #HS()
    connect_mysql()#开启数据库连接
    EXE()#执行程序

这是我做的区块链的第一个作业,觉得还不是很理想。不过,有时间会再改进的。
关于网络安全方面,我一个计算机相关专业的拉胯大学生实在不好评估。不过,没有永远安全的盾,也没有永远锋利的矛。只是花费的成本问题,和设计理念不同造成的差异。
我觉得是不是可以思考一个问题,假的东西是假的,要仿真是容易识破的,真的东西作假呢?是不是就很难识破了?
有关这个问题的思考,要是有同道中人,欢迎一起探讨。

最后,感谢大家前来观看鄙人的文章,文中或有诸多不妥之处,还望大家指出和海涵。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不羁_神话

感谢支持,欢迎交流。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值