数据加密分为单向加密、对称加密和非对称加密。单向加密常用算法有MD5和SHA系列,对称加密常用算法有DES、3DES、AES,非对称加密常见算法有RSA、ECC
这里的数据可以是用户名、密码、文本、图片、PDF,小到几百b,达到几十G。一般而言,如果不是搞信息安全的,了解这些加密方式的优缺点和适用场景即可,不用去看其实现原理。(更详细的直接看参考链接)
MD5(message digest,消息摘要)
根据数据生成128 bit(16字节)的散列值(hash value),如果数据有任何变化,生成的散列值就不一样。一般我们看到的是用16进制表示的散列值,有32个字符(128/4)。生成MD5时要求数据的长度对512取模得448,如果不够在数据后面进行填充,填充第一位为1,其余为0
应用场景有:
1.文件一致性校验(常用)。例如通过对比本地文件和线上文件的MD5是否一致来判断本地文件是否需要更新,再通过对比下载文件和线上文件的MD5来判断文件是否有下载完整;
2.密码签名校验(少用)。根据用户注册时输入的用户名和密码分为生成MD5值,将用户下次登录时输入的用户名和密码的MD5与初次输入的进行对比来判断用户是否可以输入。因为用户名和密码都是很短的字符串,可以通过撞库的方式反向推出用户名和密码,尽管这种概率极低,仍使得MD5用于密码签名校验时不安全。
(什么是撞库:每个密码有一个唯一对应的MD5,将几乎所有可能的MD5对应的密码收集起来放到一个库里,一旦获取了某个MD5值,可以逆向得到密码。免费在线MD5解密网站:http://md5.cn/)
(为了防止撞库,一般会对密码做加盐处理,即用户输入密码后,再拼接额外的字符串,用新的字符串生成的MD5做校验)
在C#中,根据文本生成MD5值的代码为:
byte[] hash = System.Security.Cryptography.MD5.Create().ComputeHash(bytesData);
string md5 = System.BitConverter.ToString(hash).Replace("-", "");
SHA(Secure Hash Algorithm)
由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。SHA系列包括:
SHA-1
SHA-2包括:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
SHA-3包括:SHA3-224、SHA3-256、SHA3-384、SHA3-512。(后面的数字表示生成的散列值为位数)
SHA在线加密工具 - MKLab在线工具
安全性SHA3 > SHA2 > SHA1,但计算速度还是MD5更快
获得单向加密的密文(也即MD5值或SHA值),不能根据密文直接逆向算出明文(也即原始数据),而采用对称加密得到的密文,可以逆向算出明文。加密和解密都需要用到秘钥。
DES(Data Encryption Standard,数据加密标准)
该算法在1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并于1977年被发布,随后在国际上广泛流传开来。然而,随着计算机的进步,DES 已经能够被暴力破解,所以该算法已经不安全了。它的密钥长度为56比特(从规格上来说,密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实际长度为56比特)3DES(Triple-DES),是DES的增强版,相当于对每组数据应用了三次DES算法。
AES(Advanced Encryption Standard,高级加密标准)
AES 的出现主要是用来取代 DES 加密算法,因为 AES 的安全性相对更高。因为目前大部分网站,包括手机 APP 后端接口,都已经使用 HTTPS 协议,而 HTTPS 在数据传输阶段大部分都是使用 AES 对称加密算法。
java - 一文搞懂单向散列加密:MD5、SHA-1、SHA-2、SHA-3 - 个人文章 - SegmentFault 思否
Java 中的加密算法: AES - Java论道 - SegmentFault 思否
java - 编程中常用的加密算法 - 个人文章 - SegmentFault 思否
java - 非对称加密算法-RSA - 程序猿 - SegmentFault 思否