介绍
加密是保障信息安全的一个组成部分,现在说的加密是一个宽泛的概念,包括解密。
定义:
是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。
加密方式的分类:
- 对称加密算法: 加密和解密密钥相同,例如,DES、3DES、AES
- 非对称加密算法 (公钥、私钥):加密和解密密钥不同,但是是一对,例如RSA、ECC
- 摘要算法 :变长变定长,不能还原,MD5、SHA、CRC
对称加密算法
DES:全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1976 年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。
3DES:也叫 Triple DES,是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次 DES 加密算法。由于计算机运算能力的增强,原版 DES 密码的密钥长度变得容易被暴力;3DES 即是设计用来提供一种相对简单的方法,即通过增加 DES 的密钥长度来避免类似的,而不是设计一种全新的块密码算法。
AES: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于 2001 年 11 月26 日发布于 FIPS PUB 197,并在 2002 年 5 月 26 日成为有效的标准。AES 算法加密强度大,执行效率高,使用简单,实际开发中建议选择 AES 算法。
拓展:Base64 编码加密后的结果(Base64不是加密算法)
加密后的结果是字节数组,这些被加密后的字节在码表(例如 UTF-8 码表)上找不到对应字符,会出现乱码,当乱码字符串再次转换为字节数组时,长度会变化,导致解密失败,所以转换后的数据是不安全的。使用 Base64 对字节数组进行编码,任何字节都能映射成对应的 Base64 字符,之后能恢复到字节数组,利于加密后数据的保存于传输,所以转换是安全的。同样,字节数组转换成 16 进制字符串也是安全的
实际 android 开发中可以用对称加密(例如选择 AES 算法)来解决很多问题,例如:
1,做一个管理密码的 app,我们在不同的网站里使用不同账号密码,很难记住,想做个 app 统一管理,但是账号密码保存在手机里,一旦丢失了容易造成安全隐患,所以需要一种加密算法,将账号密码信息加密起来保管,这时候如果使用对称加密算法,将数据进行加密,秘钥我们自己记载心里,只需要记住一个密码。需要的时候可以还原信息。 2,android 里需要把一些敏感数据保存到 SharedPrefrence 里的时候,也可以使用对称加密,这样可以在需要的时候还原。 3,请求网络接口的时候,我们需要上传一些敏感数据,同样也可以使用对称加密,服务端使用同样的算法就可以解密。或者服务端需要给客户端传递数据,同样也可以先加密,然后客户端使用同样算法解密。
非对称加密算法
与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。简单理解为:加密和解密是不同的钥匙
非对称加密用途:
1,身份认证一条加密信息若能用 A 的公钥能解开,则该信息一定是用 A 的私钥加密的,该能确定该用户是 A。
2,陌生人通信:A 和 B 两个人互不认识,A 把自己的公钥发给 B,B 也把自己的公钥发给 A,则双方可以通过对方的公钥加密信息通信。C 虽然也能得到 A、B 的公钥,但是他解不开密文
非对称加密一般不会单独拿来使用,他并不是为了取代对称加密而出现的,非对称加密速度比对称加密慢很多,极端情况下会慢 1000 倍,所以一般不会用来加密大量数据,通常我们经常会将对称加密和非对称加密两种技术联合起来使用,例如用非对称加密来给称加密里的秘钥进行加密(即秘钥交换)
消息摘要
使用场景:
1. 对用户密码进行 md5 加密后保存到数据库里
2. 软件下载站使用消息摘要计算文件指纹,防止被篡改
3. 数字签名
MessageDigest digest = MessageDigest.getInstance(“MD5”);
byte[] result = digest.digest(content.getBytes());
//消息摘要的结果一般都是转换成 16 进制字符串形式展示
String hex = Hex.encode(result);
//MD5 结果为 16 字节(128 个比特位)、转换为 16 进制表示后长度是 32 个字符
//SHA 结果为 20 字节(160 个比特位)、转换为 16 进制表示后长度是 40 个字符
消息摘要后的结果是固定长度,无论你的数据有多大,哪怕是只有一个字节或者是一个 G 的文件,摘要后的结果都是固定长度
经常听到有人问这样的问题,MD5 摘要后结果到底是多少位?有的人说是 16 位,有的说是 128 位,有的说是 32 位。到底是多长,这个时候我们就要明白,16 位指的是字节位数,128 位指的是比特位,32 位指的结果转换成 16 进制展示的字符位数。
数字签名
数字签名是非对称加密与数字摘要的组合应用应用场景:
- 校验用户身份(使用私钥签名,公钥校验,只要用公钥能校验通过,则该信息一定是私钥持有者发布的)
- 校验数据的完整性(用解密后的消息摘要跟原文的消息摘要进行对比)
数字证书
数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在 Internet 上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构——CA 机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份
应用场景
- 1,交易者身份的确定性、不可否认性、不可修改性
- 2,对应用进行签名认证(例如 Android 的 apk)
相关加密算法代码下载