实例5 简单的密码加密
1. 编程背景
明文密码存在信息安全的隐患,特别是对于信息量较大的信息系统而言,故对密码加密很有必要。
常见的加密方式有:
MD5加密、Base64加密、SHA1加密
这些加密算法使用后,他人基本上无法通过计算还原出原始密码。
2. 实现编程
使用最简单、最直接的方式,对密码进行加密,目的是提供一种小技巧,实现可通过阅读其他相关代码扩展思路,达到举一反三的效果。
# -*- coding:utf-8 -*-
# author:wanglisha
"""实例5 简单的密码加密
"""
def passwd_pre(pwd):
"""对密码中每个字符进行转换得到一个新字符串"""
vret = []
# 取得密码的每一个字符,通过以下方式换成另一个字符
for char in pwd:
if char in 'abc':
char = '!'
elif char in 'def':
char = '@'
elif char in 'ghi':
char = '#'
elif char in 'jkn':
char = '$'
elif char in 'opq':
char = '%'
elif char in 'rst':
char = '^'
elif char in 'uvw':
char = '&'
elif char in 'xyz':
char = '*'
elif char.isupper():
# 对于大写字母,先通过char.lower()将其转换成小写字母,然后转成16位数值并加1
# 也就是将大写字母转换成后一位的小写字母
char = chr(ord(char.lower()) + 1)
# 把转换后的字符加入到vret列表变量中
vret.append(char)
# 把列表中各项连接成字符串并返回
return ''.join(vret)
# 该函数根据传入的密码和两个字符串,对密码中字符进行转换
# 主要功能是根据密码pwd中的每个字符,在字符串str1中找到对应的位置索引
# 通过这个索引值在字符串str2中找到一个字符替换密码中的字符
def change_txt(pwd, str1, str2):
# 初始化返回值
vret = ''
# 将字符串小写
pwd = pwd.lower()
for char in pwd:
# 取得在str1中的索引值
j = str1.find(char)
# 在str1中没有这个字符,然后就返回-1
if j == -1:
# 没有找到这个索引值,就保留字符原值
vret = vret + char
else:
# 找到索引值,根据这个索引值在str2中取得一个字符替换原字符
vret = vret + str2[j]
return vret
def change_password(pwd):
"""加密程序
"""
# 判空
if pwd == None:
return '-1'
vret = ''
# 取得一个字符串,作为转换后密码的前缀
vpre = passwd_pre(pwd)
vlen = len(pwd)
# 调用函数对密码进行一次转换,函数后两个参数决定返回值的内容
vstr = change_txt(pwd, "1234567890abcdefghijklmipopqrstuvwxyz",
"abcdefghijklmipopqrstuvwxyz1234567890")
if vlen < 4:
vret = vpre + vstr[0:vlen]
else:
vret = vpre + vstr[0:4]
# 调用函数对密码进行一次转换
vstr = change_txt(pwd, "1234567890abcdefghijklmipopqrstuvwxyz",
"qrstuvwxyzabcdefghijklmipop1234567890")
if vlen < 4:
vret = vret + vstr[0:vlen]
else:
vret = vret + vstr[0:4]
# 调用函数对密码进行一次转换
vstr = change_txt(pwd, "1234567890abcdefghijklmipopqrstuvwxyz",
"1qabcd2e3f4gh5i6j7k8l9m0ipopqrstuvwxyz")
return vret
if __name__ == '__main__':
while True:
pwd = input('请输入密码:')
if pwd == 'q':
print('退出程序...')
else:
pwdnew = change_password(pwd)
print('您录入的密码是:',pwd,'该密码加密后为:',pwdnew)
3. 知识拓展
3.1 使用md5实现明文加密
# -*- coding:utf-8 -*-
# author:wanglisha
import hashlib
def after_md5(pwd):
"""实现md5加密"""
# 实例化md5
vmd5 = hashlib.md5()
# 对原文进行md5加密运算
vmd5.update(pwd.encode('utf-8'))
# 输出密文
return vmd5.hexdigest()
if __name__ == '__main__':
pwd = '123456'
print('明文:%s, 密文:%s' % (pwd, after_md5(pwd)))
"""打印输出:
明文: 123456, 密文: e10adc3949ba59abbe56e057f20f883e
"""
3.2 使用Base64实现明文加密
# -*- coding:utf-8 -*-
# author:wanglisha
import base64
def encode_base64(pwd):
"""实现base64加密"""
vret = base64.b64encode(pwd.encode('utf-8')).decode('utf-8')
return vret
if __name__ == '__main__':
# 明文
pwd = '123456'
# 使用base64加密
vencode = encode_base64(pwd)
# 打印明文和密文
print("明文: %s, 密文: %s" % (pwd, vencode))
"""打印输出:
明文: 123456, 密文: MTIzNDU2
"""
3.3 使用sha1实现明文加密
# -*- coding:utf-8 -*-
# author:wanglisha
import hashlib
def encode_sha1(pwd):
"""实现sha1加密"""
vret = hashlib.sha1(pwd.encode('utf-8')).hexdigest()
return vret
if __name__ == '__main__':
pwd = '123456'
print('明文:{0}, 密文:{1}'.format(pwd, encode_sha1(pwd)))
"""打印输出:
明文:123456, 密文:7c4a8d09ca3762af61e59520943dc26494f8941b
"""
3.4 三者对比
4.文档参考
^v59^control,201^v3^control&utm_term=python%20sha1%E5%8A%A0%E5%AF%86&spm=1018.2226.3001.4187
^v59^control,201^v3^control&utm_term=python%20base64%E5%8A%A0%E5%AF%86&spm=1018.2226.3001.4187
^v59^control,201^v3^control&utm_term=python%20MD5%E5%8A%A0%E5%AF%86&spm=1018.2226.3001.4187