一、单向加密算法MD5和SHA
1、MD5加密算法
概念:MD5 (Message Digest Algorithm MD5消息摘要算法第五版),为计算机安全领域的一种散列函数(杂凑算法/摘要算法/哈希算法),用以提供完整性保护。
作用:MD5的作用是让大容量信息在用数字签名软件签署 私人密钥前被“压缩”成一种保密的格式(就是把一个任意长度的字符串变成一定长的十六进制数字串)。
特点:
(1)压缩性:任意长度的数据,算出的MD5值长度固定的;
(2)易计算:从原数据计算MD5值很容易;
(3)抗修改性:对原数据进行任何改动,哪怕只修改一个字节,所得到的MD5值都很大区别;
(4)强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值得数据(即伪造数据)是非常困难的。
2、代码实现:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 描述:MD5加密算法(信息摘要算法)
* 功能:对一段Message(字符串)产生指纹,以防止被篡改,确保信息传输完整一致
* @author xss
*
*/
public class MD5Util {
private final static String HEXS = "0123456789ABCDEF";
private MD5Util() {}
public static String toMd5(String plainText) {
MessageDigest md5;
byte[] m = null;;
try {
md5 = MessageDigest.getInstance("MD5");
md5.update(plainText.getBytes());
m = md5.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return byteArray2Hex(m);
}
private static String byteArray2Hex(byte[] raw) {
if (raw == null) {
return null;
}
final StringBuilder hex = new StringBuilder(2 * raw.length);
for (final byte b: raw) {
hex.append(HEXS.charAt((b & 0xF0) >> 4)).append(HEXS.charAt((b & 0x0F)));
}
return hex.toString();
}
}
二、对称加密和非对称加密
1、对称加密:加密和解密使用同样规则(简称“密钥”),这被称为“对称加密算法”。
模式:
(1)A选择某一种加密规则,对信息加密;
(2)B使用同一种规则,对信息解密。
弱点:A必须把加密规则告诉B,否则无法解密。保存和传递密钥,就成为了一个很大的问题。
常见对称加密算法: 对称加密算法用来对敏感数据等信息进行加密,常用算法包括:
(1)DES:数据加密标准,速度较快,适用于加密大量数据的场合。
(2)3DES:是基于DES,对一块数据用三个不同的密钥进行三次加密,速度更高。
(3)AES:高级加密标准,是下一代的加密算法标准,速度快,安全级别高。
2、非对称加密
概念:加密和解密使用不同的规则,两种规则之间存在某种对应的关系,可避免直接传递密钥。
模式:
(1)A生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的;
(2)B获取A的公钥,然后用它对信息加密;
(3)A得到B加密的信息后,用私钥解密。
如果公钥加密的信息只有私钥解得开,那么只有私钥不泄露,通信就是安全的。
3、对称与非堆成算法比较
(1)管理方面:公钥密码算法(非对称)只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n,一个是n2)。所以私钥密码算法(对称)不适应广域网的使用,而且更重要的一点是它不支持数字签名。
(2)安全方面:由于非对称算法基于未解决的数学难题,再破解上几乎不可能。对于对称算法,到了AES理论上不能破解,但从计算机的发展角度看,非对称更具优越性。
(3)速度方面:AES的软件实现速度已经达到了每秒数兆或数十兆比特,是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。
4、加密算法选择
(1)当需要加密大量数据时,建议采用对称加密算法,提高解密速度,因为非对称加密算法的运行速度比对称加密算法的速度慢很多;
(2)对称加密算法不能实现签名,因此签名只能非对称算法;
(3)由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着安全性,因此当数据量很小时,可以考虑使用非对称加密算法;
(4)实际操作中,通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
在选定了加密算法后,一般,密钥位数越长,运行的速度越慢,应根据实际安全级别选择,RSA建议1024位,ECC建议160位,AES建议128位。
5、常见非对称加密算法(RSA\DSA\ECC)
DSA:数字签名算法,是一种标准的DSS(数字签名标注)。
ECC:椭圆曲线密码编码学。
RSA算法,是由三位数学家Rivest、Shamir 和 Adleman 的名字命名,是被应用最为广泛的一种“非对称加密算法”,可以说,只要有计算机网络的地方,就有RSA算法。
优点:这种算法非常可靠,密钥越长,越难破解。据文献披露,目前被破解的最长RSA密钥是768个二进制位,也即,长度超过768位的密钥,还无法破解。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥及其安全。
欧拉定理是RSA算法的核心。
三、RSA加密算法
1、正常流程
A产生一对RSA公钥和密钥{A_public_key, A_private_key}用来进行和B之间通信信息的加密和解密,公钥加密,私钥解密。一般地流程是,B向A发送明文数据,先要从A获取A_public_key加密发送的明文信息,A获取到A_public_key加密信息后,就用A_private_key解密加密信息,就可以得到B发送的明文数据.
2、被截获流程 [中间人攻击 / 公钥体系的Achilles脚跟 —— 信息篡改]
A产生一对RSA公钥和密钥{A_public_key, A_private_key},发送给B的途中被C给截取了,现在C就拥有了A和B交互的公钥和密钥,此时C自己生成一对RSA公钥和密钥{C_public_key, C_private_key},将自己的公钥C_public_key传给B,让B相信这就是A的公钥,B此时拿到的其实是C的公钥C_public_key,然后用C的公钥给发送到A的明文信息加密[B_to_A_Secreted],这个加密后的信息[B_to_A_Secreted]再次被C截获,本来用C的公钥加的密,所有C通过自己的私钥C_private_key解密后得到B->A的明文信息,然后将这段明文信息用最开始截获到的A的公钥A_public_key加密发送给A,好让A不发现和B的通信被偷听过。
3、RSA算法原理
[参考:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html]
(1)互质关系:如果两个正整数,除了1以外,没有其他公因子,就称这两个数十互质关系。
(2)欧拉函数
任意给定正整数n,问在小于n的正整数之中,有多少个数与n构成互质关系?
(如:在小于8的整数1-8中,有多少个数和8是互质关系?),计算这个值得方法就叫做欧拉函数,用φ(n)表示。
如:在1-8中与8构成互质关系的数有1,3,5,7,所以φ(n)=4。
公式:如果n可以分解成两个互质的整数之积:n = p1 * p2,则φ(n) = φ(p1*p2) = φ(p1) * φ(p2) .
即 积的欧拉函数 = 各个因子的欧拉函数之积。如:φ(56) = φ(7) * φ(8) = 4 * 6 = 24个
(3)欧拉定理
如果有两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的公式成立:a(φ(n)次方) = 1( mod n)
即 a的φ(n)次方被n整除的余数为1,也即:a(φ(n)次方) - 1 = k * n .
(4)模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得a*b-1=kn,可以被n整除,也即 a*b 被 n 除的余数为1,这时,b就叫做a的“模反元素”。
比如,3和11互质,那么3的模反元素就是4,因为 (3 ×4)-1 可以被11整除,但模反元素不只一个。
(5)密钥生成步骤
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
四、中间人攻击
1、概念
中间人攻击(Man in the middleAttack,简称“MIMT攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控件的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机简称“中间人”。
MIMT是一种由来已久的网络入侵手段,如SMB会话劫持、DNS欺骗等攻击时典型的MIMT攻击。简言之,所谓的MIMT攻击时通过拦截正常的网络数据通信,并进行数据篡改和嗅探,而通信的双方却毫不知情。
最初攻击方式:攻击者只要将网卡设为混杂模式,伪装成代理服务器监听特定的流量就可以实现攻击,这是因为很多通信协议都是以明文来进行传输的,如HTTP、FTP、Telnet等。
后来,随着交换机代替集线器,简单的嗅探攻击已经不能成功,必须进行ARP欺骗才行。
如今,越来越多的服务商(网上银行、邮箱登录)开始采用加密通信,SSL(安全套接层)是一种广泛使用的技术,HTTPS、FTPS等都是建立在其基础上的。
2、攻击方式
(1)信息篡改
主机A和主机B通信时,都由主机C来为其“转发”,攻击主机C在中间成为了一个转发器,C不仅可以窃听A、B的通信还可以对信息进行篡改再传给对方,C便可以将恶意嘻嘻传递给A、B以达到自己的目的。
(2)信息窃取
当A、B通信时,C不主动为其去“转发”,只是把他们的传输的数据备份,以获取用户网络的活动,包括账户、密码等敏感信息,这是被动攻击非常难被发现的。
附:Sha加密算法源码
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 描述:主要适用于数字签名标准DSS里面定义的数字签名算法,
* SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,
* 也可以简单的理解为取一串输入码(称为预映射或信息),
* 并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
* 功能:通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),
* 报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,
* 比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。
*
* @author xss
*
*/
public class SHAUtil {
public static String SHA1(String decript) {
try {
MessageDigest digest = java.security.MessageDigest
.getInstance("SHA-1");
digest.update(decript.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
}