RSA/DES/Hash/MD5,数字签名,证书和认证(安全)-国际、国密
来源:互联网 发布:seo标题是什么意思 编辑:程序博客网 时间:2024/06/11 15:45
Java科普之加密算法- http://blog.csdn.net/reboot123/article/details/51690117
RSA与SSL浅析-- http://blog.csdn.net/laughing2333/article/details/52292481
RSA应用场景:SSH(口令登录、密钥登录)
openssl RSA加密-- http://blog.csdn.net/stormbjm/article/details/46898757
>>>>>>>> 国际算法 <<<<<<<<<
> RSA: (公钥加密,私钥解密;私钥签名,公钥验签)
密钥体制:对称密钥体制和非对称密钥体制。RSA算法原理--http://blog.jobbole.com/42699/ http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
非对称算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。
关于互质关系,不难得到以下结论:
1. 任意两个质数构成互质关系,比如13和61。
2. 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。
3. 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。
4. 1和任意一个自然数是都是互质关系,比如1和99。
5. p是大于1的整数,则p和p-1构成互质关系,比如57和56。
6. p是大于1的奇数,则p和p-2构成互质关系,比如17和15。
加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。
“对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成
这就是著名的费马小定理。它是欧拉定理的特例。
欧拉定理是RSA算法的核心。理解了这个定理,就可以理解RSA。
“公钥加密算法”是计算机通信安全的基石,保证了加密数据不会被破解。
公钥密码学则与以前的所有方法都截然不同。一方面公开密钥算法基于数学函数而不是替代和置换,更重要的是,公开密钥密码学是非对称的,它用到两个不同的密钥,而对称的常规加密则只使用一个密钥。使用两个密钥对于保密通信,密钥分配和鉴别等领域都有着深远的影响。
RSA的安全基于大数分解的难度。其公开密钥和私人密钥是一对大素数(100到200个十进制数或更大)的函数。从一个公开密钥和密文中恢复出明文的难度等价于分解两个大素数之积。
实际应用中,RSA密钥一般是1024位,重要场合则为2048位。因此目前被破解的最长RSA密钥就是768位。
实际应用中,公钥和私钥的数据都采用ASN.1格式表达(实例)。
-------------------------------------------------------------------
> AES
JAVA实现AES加密-- http://www.cnblogs.com/freeliver54/archive/2011/10/08/2202136.html
近些年DES使用越来越少,原因就在于其使用56位密钥,比较容易被破解,近些年来逐渐被AES替代,AES已经变成目前对称加密中最流行算法之一;AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据。
DES加密算法java实现(核心算法+源代码)--http://download.csdn.net/detail/the_fire/4907939
SimpleDES 算法 java 实现-- http://blog.csdn.net/rootcn/article/details/8068112
DES算法的实现-- http://blog.csdn.net/kamaliang/article/details/6691653
JAVA实现DES加密和解密实现详解-- http://www.cnblogs.com/langtianya/p/3715975.html
DES密码算法要求主要為以下四点:
1.提供高质量的数据保护,防止数据未经授权的洩露和未被察觉的修改;
2.具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便於理解和掌握
3.DES密码体制的安全性应该不依赖於算法的保密,
4.其安全性仅以加密密钥的保密為基础实现经济,运行有效,并且适用於多种完全不同的应用。
DES算法的入口参数有三个:Key、Data、Mode。其中Key為8个字节共64位,是DES算法的工作密钥;Data也為8个字节64位,是要被加密或被解密的数据;Mode為DES的工作方式,有两种:加密或解密。
比较常见的对称加密有:DES、3DES、RC4、AES等等;Windows加密库中,默认则是CBC模式。
加密算法都有几个共同的要点:
1.密钥长度;(关系到密钥的强度)
2.加密模式;(ecb、cbc等等)
3.块加密算法里的填充方式区分;
Openssl库要更明显一点,它的函数名里面就写明了,比如:DES_ncbc_encrypt,一看就知道是cbc模式。
JAVA里面也比较清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式。
电子密码本模式ECB算法特点:
1.每次Key、明文、密文的长度都必须是64位;
2.数据块重复排序不需要检测;
3.相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;
4.一个错误仅仅会对一个密文块产生影响;
加密反馈模式CFB特点:
1.每次加密的Pi和Ci不大于64位;
2.加密算法和解密算法相同,不能适用于公钥算法;
3.使用相同的密钥和初始向量的时候,相同明文使用CFB模式加密输出相同的密文;
4.可以使用不同的初始化变量使相同的明文产生不同的密文,防止字典攻击;
5.加密强度依赖于密钥长度;
6.加密块长度过小时,会增加循环的数量,导致开销增加;
7.加密块长度应时8位的整数倍(即字节为单位);
8.一旦某位数据出错,会影响目前和其后8个块的数据;
输出反馈模式OFB特点:
1.与CFB类似,以下都是不同之处;
2.因为密文没有参与链操作,所以使得OFB模式更容易受到攻击;
3.不会进行错误传播,某位密文发生错误,只会影响该位对应的明文,而不会影响别的位;
4.不是自同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化;
5.每次重新同步时,应使用不同的初始向量。可以避免产生相同的比特流,避免”已知明文”攻击 ;
ECB是不推荐的方式,Key相同时,相同的明文在不同的时候产生相同的明文,容易遭到字典攻击;
CBC由于加入了向量参数,一定程度上抵御了字典工具,但缺点也随之而来,一旦中间一个数据出错或丢失,后面的数据将受到影响;
CFB与CBC类似,好处是明文和密文不用是8bit的整数倍,中间一个数据出错,只影响后面的几个块的数据;
OFB比CFB方式,一旦一个数据出错,不会影响后面的数据,但安全性降低;
因此,推荐使用CFB方式,但每个数据包单独加密,否则一个数据包丢失,需要做很多容错处理;
当然,具体问题也要具体分析,对于只需要”特定安全性”①,不需要”计算安全性”以上的软件,也可以使用ECB模式;
------------------------------------------------------------
> Hash:
摘要算法:常见的有CRC32(32位循环冗余校验),从MD2、MD3、MD4发展而来的MD5(消息摘要算法第五版),SHA1(安全哈希算法)
当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法。若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:
1.如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。
2.如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。
public class OverrideEqualHash {
private int x;
private int y;
public OverrideEqualHash(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OverrideEqualHash other = (OverrideEqualHash) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
-------------
public class HashSetAndHashCode {
public static void main(String[] args) {
HashSet<OverrideEqualHash> hs2 = new HashSet<OverrideEqualHash>();
OverrideEqualHash p21 = new OverrideEqualHash(3, 3);
OverrideEqualHash p22 = new OverrideEqualHash(3, 3);
OverrideEqualHash p23 = new OverrideEqualHash(3, 5);
hs2.add(p21);
hs2.add(p22);
hs2.add(p23);
System.out.println(hs2.size());
}
}
一致性Hash算法:
先构造一个长度为2^32 的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 2^32 -1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 2^32 -1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。这种算法解决了普通余数Hash算法伸缩性差的问题,可以保证在上线、下线服务器的情况下尽量有多的请求命中原来路由到的服务器。
这里使用红黑树,选用红黑树的原因有两点:
1、红黑树主要的作用是用于存储有序的数据,这其实和第一种解决方案的思路又不谋而合了,但是它的效率非常高
2、JDK里面提供了红黑树的代码实现TreeMap和TreeSet
为什么要重新计算Hash值:
/**
* String的hashCode()方法运算结果查看
* @author 五月的仓颉 http://www.cnblogs.com/xrq730/
*
*/
public class StringHashCodeTest
{
public static void main(String[] args)
{
System.out.println("192.168.0.0:111的哈希值:" + "192.168.0.0:1111".hashCode());
System.out.println("192.168.0.1:111的哈希值:" + "192.168.0.1:1111".hashCode());
System.out.println("192.168.0.2:111的哈希值:" + "192.168.0.2:1111".hashCode());
System.out.println("192.168.0.3:111的哈希值:" + "192.168.0.3:1111".hashCode());
System.out.println("192.168.0.4:111的哈希值:" + "192.168.0.4:1111".hashCode());
}
}
我们在做集群的时候,集群点的IP以这种连续的形式存在是很正常的。看一下运行结果为:
192.168.0.0:111的哈希值:1845870087
192.168.0.1:111的哈希值:1874499238
192.168.0.2:111的哈希值:1903128389
192.168.0.3:111的哈希值:1931757540
192.168.0.4:111的哈希值:1960386691
一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。Memcached client也选择这种算法,解决将key-value均匀分配到众多Memcached server上的问题。它可以取代传统的取模操作,解决了取模操作无法应对增删Memcached Server的问题(增删server会导致同一个key,在get操作时分配不到数据真正存储的server,命中率会急剧下降)
---------------------------------------------------------
> MD5:
MD5加密算法的java实现--http://www.cnblogs.com/computer-lzy/archive/2011/04/28/2031649.html
http://blog.csdn.net/zidan_2011/article/details/7708557
MD5和RSA加密算法Java完成实现 http://download.csdn.net/detail/yanzi1225627/7382263
/**
* MD5的算法在RFC1321 中定义
* 在RFC 1321中,给出了Test suite用来检验你的实现是否正确:
* MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
* MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
* MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
* MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
* MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
*
* @author yilee
*
* 传入:一个字节数组
* 传出:字节数组的 MD5 结果字符串
*/
public class MD5 {
public static String getMD5(byte[] source) {
String s = null;
char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
md.update(source);
byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
// 用字节表示就是 16 个字节
char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
// 所以表示成 16 进制需要 32 个字符
int k = 0; // 表示转换结果中对应的字符位置
for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
// 转换成 16 进制字符的转换
byte byte0 = tmp[i]; // 取第 i 个字节
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
// >>> 为逻辑右移,将符号位一起右移
str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
}
s = new String(str); // 换后的结果转换为字符串
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
}
-----------------------------------------------------------------
> Java的安全学习(包括加密,数字签名,证书和认证)
消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。
目前广泛使用的算法有MD4、MD5、SHA-1
public class MessageDigestTest{
public static void main(String[] args) throws Exception{
String str="123";
byte[] plainText=str.getBytes("UTF8");
//使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
System.out.println("/n"+messageDigest.getProvider().getInfo());
//开始使用算法
messageDigest.update(plainText);
System.out.println("/nDigest:");
//输出算法运算结果
System.out.println(new String(messageDigest.digest(),"UTF8"));
}
}
公钥与私钥的作用是:用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密。
数字签名:
I.电子商务中数据传输的几个安全性需求
1. 数据的保密性:用于防止非法用户进入系统及合法用户对系统资源的非法使用;通过对一些敏感的数据文件进行加密来保护系统之间的数据交换,防止除接收方之外的第三方截获数据及即使获取文件也无法得到其内容。如在电子交易中,避免遭到黑客的袭击使信用卡信息丢失的问题。
2. 数据的完整性:防止非法用户对进行交换的数据进行无意或恶意的修改、插入,防止交换的数据丢失等。
3. 数据的不可否认性:对数据和信息的来源进行验证,以确保数据由合法的用户发出;防止数据发送方在发出数据后又加以否认;同时防止接收方在收到数据后又否认曾收到过此数据及篡改数据。
上述需求对应于防火墙、加密、数字签名、身份认证等技术,但其关键在于数字签名技术。
II.数字签名的含义
数字签名是通过一个单向函数对要传送的报文进行处理得到的用以认证报文来源并核实报文是否发生变化的一个字母数字串。
III.数字签名的实现方法
实现数字签名有很多方法,目前数字签名采用较多的是公钥加密技术,如基于RSA Date Security 公司的PKCS( Public Key Cryptography Standards )、Digital Signature Algorithm、x.509、PGP(Pretty Good Privacy). 1994年美国标准与技术协会公布了数字签名标准(DSS)而使公钥加密技术广泛应用。&127;公钥加密系统采用的是非对称加密算法。
> 数字证书(X509、P7、P12等)
数字证书简介及Java编码实现--http://www.cnblogs.com/SirSmith/p/4996392.html
Java 生成数字证书系列(三)生成数字证书-- http://blog.csdn.net/happylee6688/article/details/42266465java(P12)证书的加密与解密--http://swordshadow.iteye.com/blog/2013575
Java代码产生根证书和签发证书(更新-- http://blog.csdn.net/benweizhu/article/details/7013271
java实现安全证书相关操作-- http://blog.csdn.net/zrbin153/article/details/8998778
HTTPS的作用
它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
SSL,Https,配置服务器证书.
Java 6提供了完善的数字证书管理实现,我们几乎无需关注,仅通过操作密钥库和数字证书就可完成相应的加密解密和签名验签过程。
数字证书的原理:
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密.在公开密钥密码体制中,常用的一种是RSA体制。
用户也可以采用自己的私钥对信息加以处理,由于密钥仅为本人所有,这样就产生了别人无法生成的文件,也就形成了数字签名。采用数字签名,能够确认以下两点:
(1)保证信息是由签名者自己签名发送的,签名者不能否认或难以否认;
(2)保证信息自签发后到收到为止未曾作过任何修改,签发的文件是真实文件。
数字证书类似于个人身份证,由数字证书颁发认证机构(Certificate Authority, CA)签发。只有经过CA签发的证书在网络中才具备可认证性。CA颁发给自己的证书叫根证书。
VeriSign, GeoTrust和Thawte是国际权威数字证书颁发认证机构的三巨头。其中应用最广泛的是VeriSign签发的电子商务用数字证书。
数字证书有多种文件编码格式,主要包含CER编码,DER编码等。
KeyTool与本地密钥库相关联,将私钥存于密钥库,公钥则以数字证书输出。KeyTool位于JDK目录下的bin目录中,需要通过命令行进行相应的操作。
1)构建自签名证书
1.申请数字证书之前,需要在密钥库中以别名的方式生成本地数字证书,建立相应的加密算法,密钥,有效期等信息。
keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 3600 -alias myCertificate -keystore myKeystore.keystore
各参数含义如下:
-genkeypair 表示生成密钥对
-keyalg 指定密钥算法,这里是RSA
-keysize 指定密钥长度,默认1024,这里指定2048
-sigal 指定签名算法,这里是SHA1withRSA
-validity 指定有效期,单位为天
-alias 指定别名
-keystore 指定密钥库存储位置
2.打印证书:
keytool -printcert -file myCer.cer
2)构建CA签发证书
1.如果要获取CA机构谁的数字证书,需要将数字证书签发申请(CSR)导出,经由CA机构认证并颁发,将认证后的证书导入本地密钥库和信息库。
keytool -certreq -alias myCertificate -keystore myKeystore.keystore -file myCsr.csr -v
各参数含义如下:
-certreq 表示数字证书申请操作
-alias 指定别名
-keystore 指定密钥库文件路径
-file 指定导出申请的路径
-v 详细信息
2.获得签发的数字证书后,需要将其导入信任库
keytool -importcert -trustcacerts -alias myCertificate -file myCer.cer -keystore myKeystore.keystore
3.查看证书
keytool -list -alias myCertificate -keystore myKeystore.keystore
> 安全套接字层(SSL Secure Sockets Layer)和传输层安全性(TLSTransport Layer Security)
安全套接字层 (SSL):一种由 Netscape Communications 开发的提议开放式标准,用以建立安全通讯通道,以防止如信用卡号等这样的重要信息被截获。
安全套接字层是用于服务器之上的一个加密系统,它可以确保在客户机与服务器之间传输的数据仍然是安全与隐密的。要使服务器和客户机使用 SSL 进行安全的通信,服务器必须有两样东西:
1.密钥对(Key pair) —— 一个密钥对包括一个公钥和一个私钥。这两个密钥用来对消息进行加密和解密,以确保在因特网上传输时的隐密性和机密性。
2.证书(Certificate) —— 证书用来进行身份验证或者身份确认。证书可以是自签(self-signed)证书,也可以是颁发(issued)证书。自签证书是为自己私有的 Web 网络创建的证书。颁发证书是认证中心(certificate authority,CA)或者证书签署者提供(颁发)给您的证书。
1.客户机正在请求的 URL。
2.提交的表单的内容。
3.访问授权信息(比如用户名和密码)。
4.所有在客户机与服务器之间发送的数据。
=====================================================
>>>>>>>> 国密算法 <<<<<<<<<
浅谈几种常见商用国密算法芯片-- https://www.douban.com/note/513154909/
国密SM2非对称算法与实现-- http://blog.csdn.net/goldboar/article/details/7004867
国密算法(SM2,SM3,SM4)完善与算法辅助工具开发-- http://blog.csdn.net/goldboar/article/details/8673981
国密SM2算法基于Openssl实现-- http://download.csdn.net/detail/goldboar/3833072
【国密算法那点事儿】解读DES和SM4、RSA和SM2及SM3--http://blog.csdn.net/slj_win/article/details/50546519
国家商用密码管理办公室制定了一系列密码标准,包括SSF33、SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法那等等。其中SSF33、SM1、SM4、SM7、祖冲之密码是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。
----------------------------------------------------
RSA非对称加解密和证书加解密
总结:从KeyStore中提取公私钥并实现RSA加密算法 http://blog.csdn.net/satcon/article/details/7363059
sun.misc.BASE64Decoder.jar http://download.csdn.net/download/start_baby/4888384
java RSA加密解密实现 - http://blog.csdn.net/wangqiuyun/article/details/42143957/
一致性HASH算法的JAVA实现- http://blog.csdn.net/freebird_lb/article/details/7602263
JAVA HASH算法-http://blog.csdn.net/zeng622peng/article/details/6036766
java加密解密——MD5算法-http://blog.csdn.net/javaman_chen/article/details/5939477 http://www.tuicool.com/articles/zq26zaF
MD5算法原理- http://blog.csdn.net/forgotaboutgirl/article/details/7258109
- RSA/DES/Hash/MD5,数字签名,证书和认证(安全)-国际、国密
- rsa数字签名与hash/md5数字摘要
- DES、RSA、RSA数字签名、MD5、SHA 加密解密代码
- 证书的数字签名和认证
- RSA DES 公钥 数字签名
- “RSA”、“数字签名”、“公钥”、“DES”
- Java的安全学习(包括加密,数字签名,证书和认证)
- Java的安全学习(包括加密,数字签名,证书和认证) 收藏
- Java的安全学习(包括加密,数字签名,证书和认证)
- Java的安全学习(包括加密,数字签名,证书和认证)
- Java的安全学习(包括加密,数字签名,证书和认证)
- Java的安全学习(包括加密,数字签名,证书和认证)
- Java的安全学习(包括加密,数字签名,证书和认证)
- DES, RC4, RC5, AES, RSA, MD5, SHA1 安全算法分析
- MD5 RSA DES
- md5,des,rsa算法
- Java 实现MD5消息摘要和RSA数字签名:
- 数字签名与安全证书
- HTML5常用标签
- 数据库主从架构
- 机器学习算法--方向传播算法(BP法)
- HDU 1575 Tr A(矩阵快速幂)
- mysql优化
- RSA/DES/Hash/MD5,数字签名,证书和认证(安全)-国际、国密
- MainUsbActivity.java
- Python入门:请重新输入并获取最新的一次输入的内容
- 欢迎使用CSDN-markdown编辑器
- C# 导出Oracle 表结构 工具
- 自定义遮盖层,帮你完成简单的操作引导
- pageContext对象的用法详述
- andSelf()使用
- BZOJ2908 又是nand