由于项目涉及到注册和登录,所以我了解一下现在app使用比较广泛的几种密码加密方法,可以当作参考,以下都是在python3.5的环境下使用这些算法的例子。
1.base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。来源:
base64使用起来比较简单方便,但主要用途不是用来加密数据,即使用了数据的安全性也很低。
例子:
import base64s = '你好,世界!'s = s.encode("utf-8")s1 = base64.encodestring(s)s2 = base64.decodestring(s1).decode("utf-8")print("原始数据:",s2)print("base64:",s1)
结果:
2.MD5
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由罗纳德·李维斯特设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范。来源:
MD5相对base64来说更加安全,但是加密之后就很难解密,无法获得原始数据。
例子:
import hashlibs = '你好,世界!'s = s.encode("utf-8")m = hashlib.md5()m.update(s)psw = m.hexdigest()print("md5:",psw)
结果:
3.bcrypt
bcrypt是一个由Niels Provos以及David Mazières根据Blowfish加密算法所设计的密码散列函数,于1999年在USENIX中展示。实现中bcrypt会使用一个加盐的流程以防御彩虹表攻击,同时bcrypt还是适应性函数,它可以借由增加迭代之次数来抵御日益增进的电脑运算能力通过暴力法破解。由bcrypt加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。然而,所提供的所有字符都具有十分重要的意义。密码越强大,您的数据就越安全。除了对您的数据进行加密,默认情况下,bcrypt在删除数据之前将使用随机数据三次覆盖原始输入文件,以阻挠可能会获得您的计算机数据的人恢复数据的尝试。如果您不想使用此功能,可设置禁用此功能。来源:
bcrypt的安全性比md5更好,因为在散列时引入了随机生成的盐(salt),使得每次生成的数据都不同。
例子:
import bcryptpaswd = "YUjun"password = paswd.encode("utf-8")hashed = bcrypt.hashpw(password,bcrypt.gensalt())print(password)print(hashed)if bcrypt.hashpw(password,hashed) == hashed: print("It maches!")else: print("It does not match:(")
结果:
4.AES
高级加密标准(Advanced Encryption Standard,AES),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES只是个基本算法,实现AES有若干模式。其中的CBC模式因为其安全性而被TLS(就是https的加密标准)和IPSec(win采用的)作为技术标准。简单地说,CBC使用密码和salt(起扰乱作用)按固定算法(md5)产生key和iv。然后用key和iv(初始向量,加密第一块明文)加密(明文)和解密(密文)。来源:
AES是现在最流行的对称加密算法,安全性高且运行快。
例子:
from Crypto.Cipher import AESobj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')message = "The answer is no"ciphertext = obj.encrypt(message)print(ciphertext)obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')print(obj2.decrypt(ciphertext))
结果:
将key改为‘This is a key125’后:
注意:AES的key必须是16(AES-128)、24(AES-192)或32(AES-256)字节长。