我感受现代科技和技术的进步,网络越来越成为生活不可或缺的一部分了,每个人都需要上网,我们也需要保护自己隐私。因此,网络安全问题,日益的加剧,网络诈骗,网络攻击手段也是层出不穷。我作为一个拉胯的计算机相关专业大学生,我觉得今天能在此跟大家分享一波个人的看法,是一件值得我高兴的事。
首先,我们在网络里面,最典型的就是账号和密码的保护。这是一件看似简单,实则不易的事,因为里面涉及的东西有很多方面。比如说,数据库攻击,脚本攻击,跨平台攻击等多方面的攻击。因为,我们用户的注册信息不可能存在一个单独数据表中,而是要存入数据库。因此,数据库的信息加密也成了一个问题,我们要实现,即便我们的防护机制被攻破了,数据库的信息也是无用的。不过,我们的用户在登录时,却要与数据库的信息进行连接对比,才会生效。
其次,现在我的学院开了区块链这门课,我觉得挺有意思的,就自学了,觉得区块链是一个不错的技术。应该能用于处理安全防护的问题。
最后,现在我所学的语言中,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()#执行程序
这是我做的区块链的第一个作业,觉得还不是很理想。不过,有时间会再改进的。
关于网络安全方面,我一个计算机相关专业的拉胯大学生实在不好评估。不过,没有永远安全的盾,也没有永远锋利的矛。只是花费的成本问题,和设计理念不同造成的差异。
我觉得是不是可以思考一个问题,假的东西是假的,要仿真是容易识破的,真的东西作假呢?是不是就很难识破了?
有关这个问题的思考,要是有同道中人,欢迎一起探讨。
最后,感谢大家前来观看鄙人的文章,文中或有诸多不妥之处,还望大家指出和海涵。