数字证书、加密以及keytool工具的使用

 关于数字证书的一些笔记:

  1. 数字签名的作用是认证,而不是加密
  2. RSA算法中,公钥加密的只能用私钥解密,反之亦然。私钥加密更有意义,因为它具备了签名的作用私钥保存在密钥库中(文件形式),同时密钥库还会保存发给客户的数字证书。
  3. 证书传递可以通过U盘传递等多种途径进行。银行的U盾就是个典型的数字证书
  4. 如果需要双向认证,则需要3个证书。对于web应用,证书要配合activeX使用
  5. webservice加证书认证,只需要安装所需要的证书,以及配置应用服务器就可以。对开发是透明的
  6. 用数字证书替代直接使用公钥,是为了防止公钥被人偷换。因为无法辨别公钥到底是不是原来的那个。
  7. SSLSocket中,server端用keystore进行监听。客户端可以将cert加到自己信任的keystore中,也可以手工解析服务器的cert文件(或其他方式存储)
  8. 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));
    }
 

你可能感兴趣的:(加密,keytool,数字证书)