术语列表:

CA:证书颁发认证机构(Certificate Authority)

PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件。

PKI:公钥基础设施(Public Key Infrastructure),可以理解成是一种平台标准。事实上所有的数字证书都符合PIK平台下的X.509标准。正式这个原因,我们才可以在之前的解析数字证书的时候可以用X509Certificate类。即使在X.509的大标准下,仍然存在不同编码格式的数字证书如CER、BER、DER和PICS(包括PKCS7、PKCS10、PKCS12等)

CSR:证书签发申请(Certificate Siging Request),是一种文件,内容包含了“我是谁”以及“我需要什么样的证书(算法名称,密钥长度等)”

数字证书

数字证书的本质其实还是非对称加密。数字证书中KeyStore充当着PrivateKey的角色(其实KeyStore中包含完整的秘钥对),Certificate充当着PublicKey的角色。

相对于普通的非对称加密算法,数字证书新增了哪些功能?

//TODO

可以用工具keytool来生成KeyStore文件,这个工具存放在在Java的bin目录中。详细说明参考官方说明:http://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html

可以用下面的命令来生成KeyStore文件:

  1. keytool -genkey -validity 30 -alias www.example.com -keyalg RSA -keystore d:\demo.keystore

参数说明:

genkey:表示生成密钥 
validity:证书有效期,单位:天
alias:证书别名
keyalg:(非对称加密)算法名称
keystore:KeyStore文件存储位置

执行过程中会要求输入相关信息:

  1. 输入keystore密码:
  2. 再次输入新密码:
  3. 您的名字与姓氏是什么?
  4. [Unknown]: hu
  5. 您的组织单位名称是什么?
  6. [Unknown]: huqiao
  7. 您的组织名称是什么?
  8. [Unknown]: huqiao
  9. 您所在的城市或区域名称是什么?
  10. [Unknown]: Beijing
  11. 您所在的州或省份名称是什么?
  12. [Unknown]: Beijing
  13. 该单位的两字母国家代码是什么
  14. [Unknown]: CN
  15. CN=huqiao, OU=huqiao, O=hu, L=Beijing, ST=Beijing, C=CN 正确吗?
  16. [否]: Y
  17.  
  18. 输入<tomcat>的主密码
  19. (如果和 keystore 密码相同,按回车):
  20. 再次输入新密码:

执行完成之后,会在指定位置生成一个.keystore的文件。这个文件中包含了密钥对等其他信息,二进制内容,所以无法用文本编辑器打开。是服务器用的。

用keytool查看keystore文件信息:

  1. keytool -list -v -keystore xxxx.keystore -storepass 密码

同样用keytool工具,来生成客户端用的cer文件:

  1. keytool -export -keystore d:\demo.keystore -alias www.example.com -file d:\demo.cer -rfc

这就是颁发给客户端的证书文件:

可以用Java来读取证书的内容:

  1. public static void main(String[] args) throws Exception{
  2.  
  3. X509Certificate cer = (X509Certificate) getCertificate("D:\\demo.cer");
  4.  
  5. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  6.  
  7. System.out.println("版本:"+cer.getVersion());
  8. System.out.println("序列号:"+Integer.toHexString(cer.getSerialNumber().intValue()));
  9. System.out.println("签名算法:"+cer.getSigAlgName());
  10. System.out.println("颁发者:"+cer.getIssuerDN());
  11. System.out.println("有限期从:" + sdf.format(cer.getNotBefore()) + "到" + sdf.format(cer.getNotAfter()));
  12. System.out.println("使用者:" + cer.getSubjectDN());
  13.  
  14. }
  15.  
  16. private static Certificate getCertificate(String certificatePath)throws Exception {
  17. CertificateFactory certificateFactory = CertificateFactory
  18. .getInstance("X.509");
  19. FileInputStream in = new FileInputStream(certificatePath);
  20.  
  21. Certificate certificate = certificateFactory.generateCertificate(in);
  22. in.close();
  23.  
  24. return certificate;
  25. }

读取到的内容:

  1. 版本:
  2. 序列号:61cb1ded
  3. 签名算法:SHA256withRSA
  4. 颁发者:CN=hu, OU=huqiao, O=huqiao, L=Beijing, ST=Beijing, C=CN
  5. 有限期从:-- ::022116-- ::
  6. 使用者:CN=hu, OU=huqiao, O=huqiao, L=Beijing, ST=Beijing, C=CN

同样,读取KeyStore的方法如下:

  1. /**
  2. * 从文件读取KeyStore文件
  3. * @param keyStoreFilePath
  4. * @param pwd
  5. * @return
  6. * @throws Exception
  7. */
  8. public static KeyStore getKeyStore(String keyStoreFilePath,String pwd)throws Exception{
  9. KeyStore keyStore = KeyStore.getInstance("jks");
  10. InputStream in = new FileInputStream(keyStoreFilePath);
  11. keyStore.load(in, pwd.toCharArray());
  12. return keyStore;
  13. }

在KeyStore中,既能拿到私钥也能拿到公钥:

  1. String pwd = "123456";
  2. String alias = "www.example.me";
  3. KeyStore keyStore = getKeyStore("D:\\demo.keystore", pwd);
  4.  
  5. PrivateKey priKey = (PrivateKey)keyStore.getKey(alias, pwd.toCharArray());
  6.  
  7. Certificate cer2 = keyStore.getCertificate(alias);
  8. PublicKey pubKey = cer2.getPublicKey();
  9. System.out.println("-------------Private Key-----------------");
  10. System.out.println(Base64Util.encode(priKey.getEncoded()));
  11. System.out.println("-------------Public Key-----------------");
  12. System.out.println(Base64Util.encode(pubKey.getEncoded()));
  1. -------------Private Key-----------------
  2. MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDRd0QlcJcrImkD5xLkjh7hQRU+
  3. 8Qi1n55k9fhKu+Ee5GTx958XGifX1zWv0IajiWcOCly9SdAWja6afNQZsXAvcoQEouwtwpOQ4KZB
  4. vipH9aWtU5JLRvPwFER2TDddb1L3fDqhozl8WSDRVLFOgYJdzKp1SblVeGfbOWEz8t4NiUlvB0f0
  5. srHubafPHy08ZDPvCy72ywuomc6kiwn/IXBRQrFBTanMxWu3mqF4XwawQ+EJlPQIBauHwCaC1N5B
  6. YQPgNbia6GmfQlATAGt94Vn/e44MZ69e/E9bnWcpSDWZ+y72DdR1YypT/Ey8ercl1Hj0tYuX67vd
  7. BoEJw/vOTPN3AgMBAAECggEAD+G0GAaeX5XfUn1tsEiaTMfrfXc3CtZMYylHJxtxqS71/Gai+FRy
  8. WuolVuw/mRys5KKif3OeRGd/qpT2W/BZKi/LlLJpp9qN57kwweFSQVx9sFOazvxVOInA2xtSQ1JS
  9. fxM7OtAuZqA3XcfHHcWyBbyj2/q4A6P6c+O43AB5F5uDBgWQT7FgMgtuh4A6U0bYaglGX6LEqztj
  10. ENw6hP1VSEQomw+EAvCTOa0xqDBN8KWJQmEqweq8loVlGr1h8bDsNFRLRUrWFAKqRYBxZ1m+c08m
  11. 1e7rRG8Pj9OcuS2SZBtzmh9NSiWDK0u/zp/A9m6yaLD6qpyfi61+1LkZzcPEAQKBgQDt8zqJ+tBS
  12. akZMOhStrdzaFu6/USnIfufmj/U/DV66gyCXaTGGw3wG2pPsqmi+XnPVWcHZ/yaILFPXVE59/eox
  13. IDiAih61U088RKhtzR/4yBZvv9AnSfz5EDC/dt6yv9ptOnaj6dPa7alN0m5lwV+qkEbuNug7azRE
  14. 8Ngd0FO5dwKBgQDhWuZu4W29KCjFTbL5yU23dgi8Dg1v/BjuGG8VBJ/RSSOM0wDT7jVyjflLRea3
  15. jXKYIhKeOqpbMN5xsVvwuF5bXdGneMzT8AAmFjpfR2P8PE9RdB61TELGtz7gov4dh6dJ+Nokxo9L
  16. PIvQ/cBL6/hKvX06VAQPcm/2BQnTBn8WAQKBgHaKiqo8mlXEffrxoGWZzQGVFSGYhJFOr6bMJuhf
  17. d8bBFpZ3oGW7s2kSsUjg6EeWdGxgR9Obag3Cz43hgS0BNw98NsnKhVveAgZLSgFRhFEDFTJcw40f
  18. LfjCWRa5WF6Cd4Wc74ffMFzLs2GCqN7mhAtLzxpTnkQjtyl1NqU7qMonAoGAVfKYPiPF+cWuPwnS
  19. P8gR1u2yiR6G63XngC9bdlWsKmLNpzD2eN26DrWtJZNEWi8dTH56QVS4kk0CGbR+D0IR4qDWjBvb
  20. at13AQ+rNZmBvbq2uaci6xxpv2Y2GfCwIE0TdXfuouYD0rsFzDBrPcmCiebZMvzGC6omn1ruk0hA
  21. AgECgYB2Ub/V5jlBtNDYjROJ1cHWKlg9uTHv6ovRiDO4jcaXwEKuoBQGgjkyxBTsIItz4GAUHVYc
  22. AxOnNCaJ94zyLzWI85/+QBOqkgS6zdkmIcBk5Lj9P+Yk7/YVlNNGp9Mv9peHRqF8dRSHtqqUWMy
  23. vDs4ZprpdLHXNcnDvtSseQ5lBA==
  24. -------------Public Key-----------------
  25. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0XdEJXCXKyJpA+cS5I4e4UEVPvEItZ+e
  26. ZPX4SrvhHuRk8fefFxon19c1r9CGo4lnDgpcvUnQFo2umnzUGbFwL3KEBKLsLcKTkOCmQb4qR/Wl
  27. rVOSS0bz8BREdkw3XW9S93w6oaM5fFkg0VSxToGCXcyqdUm5VXhn2zlhM/LeDYlJbwdH9LKx7m2n
  28. zx8tPGQz7wsu9ssLqJnOpIsJ/yFwUUKxQU2pzMVrt5qheF8GsEPhCZT0CAWrh8AmgtTeQWED4DW4
  29. muhpn0JQEwBrfeFZ/3uODGevXvxPW51nKUg1mfsu9g3UdWMqU/xMvHq3JdR49LWLl+u73QaBCcP7
  30. zkzzdwIDAQAB

有效期验证:

  1. /**
  2. * 有限期验证
  3. * @param cer
  4. * @param date
  5. * @return
  6. */
  7. public static boolean verifyDate(Certificate cer,Date date){
  8. X509Certificate x509Certificate = (X509Certificate) cer;
  9. try {
  10. x509Certificate.checkValidity(date);
  11. return true;
  12. } catch (Exception e) {
  13. return false;
  14. }
  15.  
  16. }

签名和验证签名:

  1. /**
  2. * 签名
  3. * @param data
  4. * @param cer
  5. * @return
  6. */
  7. public static String sign(String data,KeyStore keyStore,String alias,String pwd)throws Exception{
  8. PrivateKey privateKey = getPrivateKey(keyStore, alias, pwd);
  9. X509Certificate cer = (X509Certificate)keyStore.getCertificate(alias);
  10. Signature signature = Signature.getInstance(cer.getSigAlgName());
  11. signature.initSign(privateKey);
  12. signature.update(data.getBytes("UTF-8"));
  13. return Base64Util.encode(signature.sign());
  14. }
  15.  
  16. /**
  17. * 验证签名
  18. * @param sign
  19. * @param cer
  20. * @return
  21. */
  22. public static boolean signVerify(String data,String sign,Certificate cer)throws Exception{
  23. byte[] signData = Base64Util.decode(sign);
  24. PublicKey publicKey = cer.getPublicKey();
  25. Signature signature = Signature.getInstance(((X509Certificate)cer).getSigAlgName());
  26. signature.initVerify(publicKey);
  27. signature.update(data.getBytes());
  28. return signature.verify(signData);
  29. }

需要注意的是签名算法应该从证书里拿,而不是密钥你拿。

加密和解密:

  1. /**
  2. * 加密
  3. * @param data
  4. * @param cer
  5. * @return
  6. */
  7. public static String encrypt(String data,Certificate cer)throws Exception{
  8. PublicKey publicKey = cer.getPublicKey();
  9. Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
  10. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  11. byte[] encrypedData = cipher.doFinal(data.getBytes("UTF-8"));
  12. return Base64Util.encode(encrypedData);
  13. }
  14.  
  15. /**
  16. * 解密
  17. * @param data
  18. * @param cer
  19. * @return
  20. */
  21. public static String decrypt(String data,KeyStore keyStore,String alias,String pwd)throws Exception{
  22. PrivateKey privteKey = getPrivateKey(keyStore, alias, pwd);
  23. Cipher cipher = Cipher.getInstance(privteKey.getAlgorithm());
  24. cipher.init(Cipher.DECRYPT_MODE, privteKey);
  25. byte[] decrypedData = cipher.doFinal(Base64Util.decode(data));
  26. return new String(decrypedData,"UTF-8");
  27. }

测试:

  1. public static void main(String[] args) throws Exception{
  2.  
  3. X509Certificate cer = (X509Certificate) getCertificate("D:\\test.cer");
  4.  
  5. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  6.  
  7. System.out.println("版本:"+cer.getVersion());
  8. System.out.println("序列号:"+Integer.toHexString(cer.getSerialNumber().intValue()));
  9. System.out.println("签名算法:"+cer.getSigAlgName());
  10. System.out.println("颁发者:"+cer.getIssuerDN());
  11. System.out.println("有限期从:" + sdf.format(cer.getNotBefore()) + "到" + sdf.format(cer.getNotAfter()));
  12. System.out.println("使用者:" + cer.getSubjectDN());
  13.  
  14. String pwd = "123456";
  15. String alias = "blog.huqiao.me";
  16. KeyStore keyStore = getKeyStore("D:\\test.keystore", pwd);
  17.  
  18. PrivateKey priKey = (PrivateKey)keyStore.getKey(alias, pwd.toCharArray());
  19.  
  20. Certificate cer2 = keyStore.getCertificate(alias);
  21. PublicKey pubKey = cer2.getPublicKey();
  22. System.out.println("-------------Private Key-----------------");
  23. System.out.println(Base64Util.encode(priKey.getEncoded()));
  24. System.out.println("-------------Public Key-----------------");
  25. System.out.println(Base64Util.encode(pubKey.getEncoded()));
  26.  
  27. String data = "Hello,Certificate";
  28. System.out.println("原文:" + data);
  29.  
  30. String sign = sign(data, keyStore, alias, pwd);
  31. System.out.println("签名:" + sign);
  32.  
  33. boolean signVerify = signVerify(data, sign,(Certificate)cer);
  34. System.out.println("签名验证:" + signVerify);
  35.  
  36. String encryptData = encrypt(data, cer);
  37. System.out.println("加密后:" + encryptData);
  38.  
  39. String decryptData = decrypt(encryptData, keyStore, alias, pwd);
  40. System.out.println("解密后:" + decryptData);
  41.  
  42. }
  1. -------------Private Key-----------------
  2. MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDRd0QlcJcrImkD5xLkjh7hQRU+
  3. 8Qi1n55k9fhKu+Ee5GTx958XGifX1zWv0IajiWcOCly9SdAWja6afNQZsXAvcoQEouwtwpOQ4KZB
  4. vipH9aWtU5JLRvPwFER2TDddb1L3fDqhozl8WSDRVLFOgYJdzKp1SblVeGfbOWEz8t4NiUlvB0f0
  5. srHubafPHy08ZDPvCy72ywuomc6kiwn/IXBRQrFBTanMxWu3mqF4XwawQ+EJlPQIBauHwCaC1N5B
  6. YQPgNbia6GmfQlATAGt94Vn/e44MZ69e/E9bnWcpSDWZ+y72DdR1YypT/Ey8ercl1Hj0tYuX67vd
  7. BoEJw/vOTPN3AgMBAAECggEAD+G0GAaeX5XfUn1tsEiaTMfrfXc3CtZMYylHJxtxqS71/Gai+FRy
  8. WuolVuw/mRys5KKif3OeRGd/qpT2W/BZKi/LlLJpp9qN57kwweFSQVx9sFOazvxVOInA2xtSQ1JS
  9. fxM7OtAuZqA3XcfHHcWyBbyj2/q4A6P6c+O43AB5F5uDBgWQT7FgMgtuh4A6U0bYaglGX6LEqztj
  10. ENw6hP1VSEQomw+EAvCTOa0xqDBN8KWJQmEqweq8loVlGr1h8bDsNFRLRUrWFAKqRYBxZ1m+c08m
  11. 1e7rRG8Pj9OcuS2SZBtzmh9NSiWDK0u/zp/A9m6yaLD6qpyfi61+1LkZzcPEAQKBgQDt8zqJ+tBS
  12. akZMOhStrdzaFu6/USnIfufmj/U/DV66gyCXaTGGw3wG2pPsqmi+XnPVWcHZ/yaILFPXVE59/eox
  13. IDiAih61U088RKhtzR/4yBZvv9AnSfz5EDC/dt6yv9ptOnaj6dPa7alN0m5lwV+qkEbuNug7azRE
  14. 8Ngd0FO5dwKBgQDhWuZu4W29KCjFTbL5yU23dgi8Dg1v/BjuGG8VBJ/RSSOM0wDT7jVyjflLRea3
  15. jXKYIhKeOqpbMN5xsVvwuF5bXdGneMzT8AAmFjpfR2P8PE9RdB61TELGtz7gov4dh6dJ+Nokxo9L
  16. PIvQ/cBL6/hKvX06VAQPcm/2BQnTBn8WAQKBgHaKiqo8mlXEffrxoGWZzQGVFSGYhJFOr6bMJuhf
  17. d8bBFpZ3oGW7s2kSsUjg6EeWdGxgR9Obag3Cz43hgS0BNw98NsnKhVveAgZLSgFRhFEDFTJcw40f
  18. LfjCWRa5WF6Cd4Wc74ffMFzLs2GCqN7mhAtLzxpTnkQjtyl1NqU7qMonAoGAVfKYPiPF+cWuPwnS
  19. P8gR1u2yiR6G63XngC9bdlWsKmLNpzD2eN26DrWtJZNEWi8dTH56QVS4kk0CGbR+D0IR4qDWjBvb
  20. at13AQ+rNZmBvbq2uaci6xxpv2Y2GfCwIE0TdXfuouYD0rsFzDBrPcmCiebZMvzGC6omn1ruk0hA
  21. AgECgYB2Ub/V5jlBtNDYjROJ1cHWKlg9uTHv6ovRiDO4jcaXwEKuoBQGgjkyxBTsIItz4GAUHVYc
  22. AxOnNCaJ94zyLzWI85/+QBOqkgS6zdkmIcBk5Lj9P+Yk7/YVlNNGp9Mv9peHRqF8dRSHtqqUWMy
  23. vDs4ZprpdLHXNcnDvtSseQ5lBA==
  24. -------------Public Key-----------------
  25. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0XdEJXCXKyJpA+cS5I4e4UEVPvEItZ+e
  26. ZPX4SrvhHuRk8fefFxon19c1r9CGo4lnDgpcvUnQFo2umnzUGbFwL3KEBKLsLcKTkOCmQb4qR/Wl
  27. rVOSS0bz8BREdkw3XW9S93w6oaM5fFkg0VSxToGCXcyqdUm5VXhn2zlhM/LeDYlJbwdH9LKx7m2n
  28. zx8tPGQz7wsu9ssLqJnOpIsJ/yFwUUKxQU2pzMVrt5qheF8GsEPhCZT0CAWrh8AmgtTeQWED4DW4
  29. muhpn0JQEwBrfeFZ/3uODGevXvxPW51nKUg1mfsu9g3UdWMqU/xMvHq3JdR49LWLl+u73QaBCcP7
  30. zkzzdwIDAQAB
  31. 原文:Hello,Certificate
  32. 签名:0NxD/FHk9CIdfoLIN7/TrQkFhEMGJzJr6E/do7aR8mgUAJjEHNg9NhXT1eaI8hszuofFPj8PhN+w
  33. fE2N2YqB8ozBbNhvMvUbeMaAK2gFrMCBsw+ihbtPwTVoc3sxY3FQSDmEgLBY2IBtmvji9XdrclNY
  34. D/IJJhg5DwlXpIoYPRIf2Ct+JkvY4sM/6xNm1ZyKb0CZbKJTAZQ57BuXU4vvs5wvB6TAK/ilR5yV
  35. TFhKlzLRS68FPCREukdiB/eITXPugfEBTCyIUQhrF2qaxdKOwyTN7dCWI16QVtAYKT9SG2Dbs5bu
  36. bBRsYlwhrLYunBER8QCvX7gHLLZIiCheQg3VaQ==
  37. 签名验证:true
  38. 加密后:rkiHwkuAdS1WikNq7bogqdmR+alDc7anV/RGcKbX9LmBJoUyQcV+Iu2K1bhc44yddnxfGy0uRqKM
  39. 9rsfPM/O1epB09oz5QdeOj8BP1Em8WEjhsG6LxU9oCPj3jypV/z6gH6fOg1idz0nS+sDuXqHqj/t
  40. rNx0n3SgztG2Ek5S/Px2STHmS+G7FghPP4ZbW0IeKSOpRbErKW82aA4AF3Rsn7e6eSzHZT+2WMs/
  41. 2oTfzwfYguimLZA4TUTJwTXJ2lK3XRkIkaBo27er81BX7IaT44bYn7y7ujiWmGEbdgOgck+FNqny
  42. gSVvYUvDvli8w5HB+0cEa7VpUDIqw3MFJ+Z2HQ==
  43. 解密后:Hello,Certificate

小结:数字证书就是在非对称加密的基础上增加了一些其他的信息,具体的加密也解密,签名也签名验证在与之前的RSA没有什么差别。

HTTPS

HTTPS是使用SSL/TLS加密的HTTP协议。

客户端与服务器通信用的是数字证书(非对称加密),客户端拿到服务器的证书,用这个证书的公钥进行数据加密,然后将数据发送给服务器。

加密通信没问题了,通信过程不会被别人窃听和篡改。但是还是有一个问题,就是如何确定服务器是否被冒牌了。

确定服务器是否是“真的”服务器时,客户端和服务器两方说了都不算数,得需要第三方来证明。这就是CA(证书颁发验证机构)。

CA负责注册服务器,记录服务器的详细信息,并给服务器颁发证书。

那么怎么确保CA的可靠性。从理论上讲无法确认,于是只能人为地构建认证机构,比如Symantec、VeriSign、GeoTrust等。这些机构向全球提供证书服务。我们的浏览器或系统内置了这些机构的证书,所以在访问这些机构或子机构认证的服务器时可以正常通过验证。

我们可以不用公共的CA服务,自己给服务器搞一个证书,但是浏览器不会认,需要手动把这些证书导入到本地系统才行。

其他相关文章:
 
 

参考:

http://snowolf.iteye.com/blog/391931

https://zhuanlan.zhihu.com/p/24854237

Java加密与解密笔记(四) 高级应用的更多相关文章

  1. Java加密与解密笔记(一) Base64和数据摘要算法

    对加密解密下面的内容一定要先理解: 甲乙双方要通信,中间的连接可能被人窃听甚至篡改.解决办法就是把传输的内容进行加密,用密文去传输,这样即使被监听也没办法知道信息的具体内容. 加密时,甲乙双方可以约定 ...

  2. Java加密与解密笔记(三) 非对称加密

    非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...

  3. Java加密与解密笔记(二) 对称加密

    前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...

  4. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  5. Java加密与解密的艺术 读书心得

    现在项目中加密与解密的方式很多,很早就想整理一下Java中加密与解密的方式,读完<<Java加密与解密的艺术>>一书.借此机会梳理一下这方面的知识点 一.基础普及 安全技术目标 ...

  6. java 加密与解密艺术

    视频来自黑马程序员公开课 对称加密之后的密文可能存在乱码,这些乱码无法识别,信息经过加密后会变成一串毫无规律的二进制串,此时再选择一种编码方式来展示,通常是 BASE64 格式的编码. 为了解决这个问 ...

  7. AES Java加密 C#解密 (128-ECB加密模式)

    在项目中遇到这么一个问题: java端需要把一些数据AES加密后传给C#端,找了好多资料,算是解决了,分享一下: import sun.misc.BASE64Decoder; import sun.m ...

  8. Java加密、解密Word文档

    对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件.下面介绍了一种比较简单的方法给Word文件添加密码保护以及如何给已加密的Word文件取消密 ...

  9. java 加密与解密艺术二

    首先需要明确的是RSA的密钥对不能手动指定,需要通过代码系统生成 接下来我们来介绍下生成密钥对 package com.weiyuan.test; import java.security.KeyPa ...

随机推荐

  1. c#鼠标点击TextBox控件后清空默认字体

    方案(一) 脚本: <script type="text/javascript" language="javascript">        //得 ...

  2. overflow-x: scroll;横向滑动详细讲解

    overflow-x: scroll;横向滑动(移动端使用详解) css3 , ie8以上 <!DOCTYPE html> <html lang="en"> ...

  3. ecshop根据订单号查询物流信息

    目标:订单详情页可以根据订单查询当前物流信息. 效果图: 思路:点击后异步请求快递查询api,接受返回信息,拼接. 代码: admin下:order_info.htm //一:顶部插入jquery,在 ...

  4. laravel MethodNotAllowedHttpException错误一个原因

    前两天在写api的时候,出现一个之前都没有碰到过的问题,如图 可以说提示信息是很不友好了,然后打开错误日志,发现报了一个MethodNotAllowedHttpException这样的错误,这样错误我 ...

  5. spark2.2 DataFrame的一些算子操作

    Spark Session中的DataFrame类似于一张关系型数据表.在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现.可以参考,Scala提供的Dat ...

  6. 02-线性结构3 Reversing Linked List

    题目 Sample Input: 00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 ...

  7. javascript权威指南pdf

    链接:https://pan.baidu.com/s/1c19qfSk 密码:j4f3

  8. 显示mysql线程和kill线程的命令

    show processlist;//显示哪些线程正在运行. kill id //kill线程   通常在表被锁的时候用.   show processlist;显示哪些线程正在运行.您也可以使用my ...

  9. windows平台下基于QT和OpenCV搭建图像处理平台

        在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...

  10. java基础部分的简单应用

    牛刀小试,MMP:嘿嘿,如有转载,请声明地址http://www.cnblogs.com/jinmoon/: 图形类,点类,三角形类,汽车类,接口:运用继承,抽象类,接口,多态:已知点类三点,输出三点 ...