关于数字证书的一些笔记:
- 数字签名的作用是认证,而不是加密
- RSA算法中,公钥加密的只能用私钥解密,反之亦然。私钥加密更有意义,因为它具备了签名的作用私钥保存在密钥库中(文件形式),同时密钥库还会保存发给客户的数字证书。
- 证书传递可以通过U盘传递等多种途径进行。银行的U盾就是个典型的数字证书
- 如果需要双向认证,则需要3个证书。对于web应用,证书要配合activeX使用
- 将webservice加证书认证,只需要安装所需要的证书,以及配置应用服务器就可以。对开发是透明的
- 用数字证书替代直接使用公钥,是为了防止公钥被人偷换。因为无法辨别公钥到底是不是原来的那个。
- SSLSocket中,server端用keystore进行监听。客户端可以将cert加到自己信任的keystore中,也可以手工解析服务器的cert文件(或其他方式存储)
- eclipse的远程调试,如果连接用的是SSL,那么服务器的jar要用jarsigner.exe签名过才能调试
keytool的使用:
#生成私钥
keytool -genkeypair -alias "UMG" -keyalg "RSA" -keystore "d:\umg.keystore"
#生成自认证证书
keytool -export -alias "UMG" -file "d:\umg.cer" -keystore "d:\umg.keystore"
#导入自认证证书
keytool -import -file "d:\umg.cer" -keystore "d:\dsv.keystore"
#逆向
keytool -genkeypair -alias "dsv" -keyalg "RSA" -keystore "d:\dsv.keystore"
keytool -export -alias "dsv" -file "d:\dsv.cer" -keystore "d:\dsv.keystore"
keytool -import -file "d:\dsv.cer" -keystore "d:\umg.keystore"
Java的加解密例子:
public class RSAUtil {
/**
* RSA加密
*/
public static byte[] encript(byte[] src,Key key) throws Exception{
Cipher cipher=Cipher.getInstance("RSA");//DES对称,RSA非对称。。。
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(src);
}
/**
* RSA解密
*/
public static byte[] decript(byte[] encripted,Key key) throws Exception{
Cipher cipher=Cipher.getInstance("RSA");//algorithm
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(encripted);
}
/**
* 生成密钥对,每次生成的密钥对都不一样
*/
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException{
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(1024);
return keyPairGen.generateKeyPair();
}
}
测试代码:
//公钥加密、私钥解密
@Test
public void testPublic2Private() throws Exception {
KeyPair keyPair = RSAUtil.generateKeyPair();
// Generate keys.可以用序列化的方式将公钥、私钥保存
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
//加密前的原始数据
String t="sfsadgdfgdfgdfgsdgf";
byte[] src=t.getBytes();
byte[] encs=RSAUtil.encript(src,publicKey);
byte[] src2=RSAUtil.decript(encs,privateKey);
Assert.assertArrayEquals(src, src2);
System.out.println(new String(src2));
}
//私钥加密、公钥解密
@Test
public void testPrivate2Public() throws Exception {
KeyPair keyPair = RSAUtil.generateKeyPair();
// Generate keys.可以用序列化的方式将公钥、私钥保存
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
//加密前的原始数据
String t="sfsadgdfgdfgdfgsdgf21534543撒的发生的";
byte[] src=t.getBytes();
byte[] encs=RSAUtil.encript(src,privateKey);
byte[] src2=RSAUtil.decript(encs,publicKey);
Assert.assertArrayEquals(src, src2);
System.out.println(new String(src2));
}