日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

数字证书 - Java加密与安全

發布時間:2024/4/13 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数字证书 - Java加密与安全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數字證書我們在前面看到了一些計算機密碼學的一些算法1. 摘要算法確保數據沒有被篡改2. 非對稱加密就是對數據進行加解密3. 數據簽名可以確保數據完整性和抗否認性而數字證書就是集合了多種密碼學算法,用于實現數據加解密,身份認證,簽名等多種功能的一種網絡安全標準我們看數字證書:1. 首先實現了非對稱加密算法,可以對數據進行加解密2. 然后他有簽名算法,能夠確保數據完整性和抗否認性3. 最后通過摘要算法,確保證書本身沒有被篡改

package com.learn.securl;import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.cert.X509Certificate; import java.util.Base64;import javax.crypto.Cipher;public class X509 {/*** 在這個類中我們定義一個privateKey* privateKey代表的是私鑰*/private final PrivateKey privateKey;/*** 和一個X509Certificate的一個變量* X509Certificate表示的是證書,公鑰,以及摘要的*/private final X509Certificate certificate;/*** 我們需要傳入keyStore和證書的名稱和password* 我們通過KeyStore的getKey方法傳入名稱和password* 就可以得到一個privateKey* 我們通過KeyStore的getCertificate方法傳入證書的名稱* 就可以得到一個X509Certificate的一個對象* @param ks* @param certName* @param password* @throws GeneralSecurityException*/public X509(KeyStore ks, String certName, String password) throws GeneralSecurityException{/*** 注意密碼用于獲得私鑰*/this.privateKey = (PrivateKey) ks.getKey(certName, password.toCharArray());/*** 獲得證書是不需要口令的*/this.certificate = (X509Certificate) ks.getCertificate(certName);}/*** 然后我們定義一個encrypt仿方法進行加密* @param message* @return* @throws GeneralSecurityException*/public byte[] encrypt(byte[] message) throws GeneralSecurityException{/*** 在加密的時候我們首先通過Cipher.getInstance* 然后我們通過privateKey.getAlgorithm獲得加密算法*/Cipher cipher = Cipher.getInstance(this.privateKey.getAlgorithm());/*** 然后我們設置ENCRYPT_MODE并且傳入privateKey*/cipher.init(Cipher.ENCRYPT_MODE, this.privateKey);/*** 然后獲取密文*/return cipher.doFinal(message);}/*** 然后我們定義一個decrypt* @param data* @return* @throws GeneralSecurityException*/public byte[] decrypt(byte[] data) throws GeneralSecurityException{/*** 在解密的時候通過certificate對象getPublicKey就可以獲得公鑰publicKey*/PublicKey publicKey = this.certificate.getPublicKey();/*** 然后我們還是通過Cipher.getInstance獲得一個Cipher對象*/Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());/*** 設置為解密模式*/cipher.init(Cipher.DECRYPT_MODE, publicKey);/*** 然后傳入publicKey* 就可以正常的解密*/return cipher.doFinal(data);}/*** 我們再定義一個sign方法用于簽名* 傳入原始的Message* @param message* @return* @throws GeneralSecurityException*/public byte[] sign(byte[] message) throws GeneralSecurityException{/*** 然后通過Signature.getInstance* 通過certificate對象getSigAlgName獲得簽名算法*/Signature signature = Signature.getInstance(this.certificate.getSigAlgName());/*** 我們用privateKey進行簽名*/signature.initSign(this.privateKey);signature.update(message);/*** 獲得簽名以后的數據*/return signature.sign();}/*** 我們再定義一個verify方法驗證簽名* 需要傳入原始信息和簽名信息* 驗證簽名的時候需要使用公鑰* 同時獲得的還有簽名的算法* @param message* @param sign* @return* @throws GeneralSecurityException*/public boolean verify(byte[] message, byte[] sign) throws GeneralSecurityException{Signature signature = Signature.getInstance(this.certificate.getSigAlgName());signature.initVerify(this.certificate);signature.update(message);return signature.verify(sign);}/*** 我們定義一個新的方法loadKeyStore* 用于加載一個KeyStore文件* 因為JAVA的數字證書是存儲在KeyStore里面的* 我們需要指定一個KeyStore的文件* 打開KeyStore用到的密碼* @param keyStoreFile* @param password* @return* @throws GeneralSecurityException* @throws IOException*/static KeyStore loadKeyStore(String keyStoreFile, String password) throws GeneralSecurityException, IOException{try(InputStream input = new BufferedInputStream(new FileInputStream(keyStoreFile))){/*** 我們通過KeyStore.getInstance得到一個KeyStore對象*/KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());/*** 通過KeyStore的load方法* 傳入一個inputStream就可以得到KeyStore對象*/ks.load(input, password.toCharArray());return ks;}}/*** 最后我們使用main方法使用數字證書以及加密和簽名,* 在執行這個程序之前,* 首先我們要創建我們的數字證書* keytool -genkeypair -keyalg RSA -keysize 1024 * -sigalg SHA1withRSA -validity 36500 -alias mycert * -keystore my.keystore -dname “CN=test07, OU=sample, * O=sample, L=BJ, ST=BJ, C=CN” -keypass 123456 * -storepass 456789* genkeypair表示我們要生成一個數字證書* -keyalg RSA他的算法是RSA* -keysize 1024他的密鑰長度是1024* -sigalg SHA1withRSA我們指定的算法長度是SHA1withRSA* -validity 36500我們指定數字證書的有效期是36500* -alias mycert我們給這個證書寫一個名字叫做mycert* -keystore my.keystore同時我們指定了一個keystore的文件叫做my.keystore* “CN=test07, OU=sample, O=sample, L=BJ, ST=BJ, C=CN”* -keypass 123456然后我們用keypass指定證書的密碼123456* -storepass 456789我們用storepass指定store的密碼是456789* 緊接著我們要給證書指定CN OU這些屬性* 如果這個證書將來要用于網站* CN的屬性必須和網站的域名完全一致* keytool -list -keystore my.keystore -storepass 456789* 我們還可以通過keytool的命令查詢證書* 我們輸入命令然后回車* 我們就可以看到包含了一個證書mycert* 我們就可以看到在項目的根目錄中生成一個my.cert的一個文件* * 我們在執行的時候可以看到* 我們在執行證書得到加密以后的密文* 解密以后得到原始的明文* 我們對數字證書對原始的消息進行簽名* 得到Base64表示的簽名* 最后我們用證書得到這個簽名結果為true* @param args* @throws GeneralSecurityException* @throws IOException*/public static void main(String[] args) throws GeneralSecurityException, IOException {byte[] message = "Hello, 使用X.509證書進行加密和簽名!".getBytes();// 讀取KeyStore:/*** 首先我們需要讀取一個KeyStore* 然后傳入KeyStore的密碼* * 注意到我們用loadKeyStore的時候傳入了keyStore文件的密碼*/KeyStore ks = loadKeyStore("my.keystore", "456789");// 讀取證書:/*** 緊接著我們需要讀取一個X509證書* 并且傳入證書的密碼* 并且獲取他的私鑰* * 我們在讀取證書的時候傳入的是證書的密碼*/X509 x509 = new X509(ks, "mycert", "123456");// 加密:/*** 然后我們進行加密*/byte[] encrypted = x509.encrypt(message);System.out.println("encrypted: " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = x509.decrypt(encrypted);System.out.println("decrypted: " + new String(decrypted, "UTF-8"));// 簽名:byte[] sign = x509.sign(message);System.out.println("sign: " + Base64.getEncoder().encodeToString(sign));// 驗證簽名:boolean verified = x509.verify(message, sign);System.out.println("verify: " + verified);} } 數字證書采用鏈式簽名認證,他的底層證書是Geo Trust 證書,然后由他簽發的GeoTrust SSL CA - G3證書,最后由mail.qq.com 我們最后來看一下數字證書的應用:1.我們在上網的時候用到的https,這個協議實際上是http over ssl2. 在使用https的時候,服務器會發送證書給客戶端,這個證書包括公鑰,簽名,和CA證書3. 客戶端可以驗證服務器端的證書是否有效,來確認服務器的身份4. 然后客戶端使用證書加密一個隨機口令,發送給服務器端,采用的是公鑰加密5. 而服務器端解密獲得一個隨機口令,采用的是私鑰解密6. 雙方隨后就可以使用AES加密進行通信,這個時候使用的是對稱加密

服務器發送的數字證書實際上是publicKey,就是公鑰,以及public的信息,比如摘要簽名等,服務器的私鑰永遠保存在服務器端,不能泄露,所以數字證書實際上包含的是公鑰最后我們總結一下:1. 數字證書實際上就是集合了多種密碼學算法,用于實現數據加解密,身份認證,簽名等多種功能的一種網絡安全標準2. 數字認證采用的是一種鏈式簽名的管理,頂級的CA證書已經內置在操作系統中3. 常用的算法有MD5,SHA1,SHA256,RSA,DSA

?

總結

以上是生活随笔為你收集整理的数字证书 - Java加密与安全的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。