国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java安全通信、數(shù)字證書及應(yīng)用實(shí)踐

2019-11-18 14:28:48
字體:
供稿:網(wǎng)友
摘要

  在本文中,我用具體的語言和大量的圖片及完整的程序源碼向你展示了在 java中如何實(shí)現(xiàn)通過消息摘要、消息驗(yàn)證碼達(dá)到安全通信、以及用Java的工具生成數(shù)字證書,和用程序給數(shù)字證書簽名、以及用簽名后的數(shù)學(xué)證書簽名applet突破applet的訪問權(quán)限的過程,給出了全部例子的具體代碼。

  通過本文中你可以學(xué)到以下知識(shí):

   ● 程序間如何安全通信

   ● 什么是 及 如何生成消息摘要

   ● 什么是 及 如何生成消息驗(yàn)證碼

   ● 如何使用 Java工具生成和維護(hù)數(shù)字證書庫(kù)

   ● 如何用程序給數(shù)字證書驗(yàn)證簽名

   ● 如何利用數(shù)字證書給 applet簽名突破applet的訪問權(quán)限

  要害字

  消息摘要、消息驗(yàn)證碼、指紋、加密、安全、 Java、數(shù)字簽名、applet、數(shù)字證書

  一、基礎(chǔ)知識(shí)

  計(jì)算機(jī)安全通信過程中,常使用消息摘要和消息驗(yàn)證碼來保證傳輸?shù)臄?shù)據(jù)未曾被第三方修改。

  消息摘要是對(duì)原始數(shù)據(jù)按照一定算法進(jìn)行計(jì)算得到的結(jié)果,它主要檢測(cè)原始數(shù)據(jù)是否被修改過。消息摘要與加密不同,加密是對(duì)原始數(shù)據(jù)進(jìn)行變換,可以從變換后的數(shù)據(jù)中獲得原始數(shù)據(jù),而消息摘要是從原始數(shù)據(jù)中獲得一部分信息,它比原始數(shù)據(jù)少得多,因此消息摘要可以看作是原始數(shù)據(jù)的指紋。

  例:下面一段程序計(jì)算一段字符串的消息摘要

package com.messagedigest;
import java.security.*;
public class DigestPass {
 public static void main(String[] args) throws Exception{
  String str="Hello,I sent to you 80 yuan.";
  MessageDigest md = MessageDigest.getInstance("md5");//常用的有MD5,SHA算法等
  md.update(str.getBytes("UTF-8"));//傳入原始字串
  byte[] re = md.digest();//計(jì)算消息摘要放入byte數(shù)組中
  //下面把消息摘要轉(zhuǎn)換為字符串
  String result = "";
  for(int i=0;i<re.length;i++){
   result += Integer.toHexString((0x000000ff&re[i])0xffffff00).substring(6);
  }
  System.out.PRintln(result);
 }
}
  當(dāng)我們有時(shí)需要對(duì)一個(gè)文件加密時(shí),以上方式不再適用。

  又例:下面一段程序計(jì)算從輸入(出)流中計(jì)算消息摘要。

package com.messagedigest;
import java.io.*;
import java.security.*;
public class DigestInput {
 public static void main(String[] args) throws Exception{
  String fileName = "test.txt";
  MessageDigest md = MessageDigest.getInstance("MD5");
  FileInputStream fin = new FileInputStream(fileName);
  DigestInputStream din = new DigestInputStream(fin,md);//構(gòu)造輸入流
  //DigestOutputStream dout = new DigestOutputStream(fout,md);
  //使用輸入(出)流可以自己控制何時(shí)開始和關(guān)閉計(jì)算摘要
  //也可以不控制,將全過程計(jì)算
  //初始時(shí)是從開始即開始計(jì)算,如我們可以開始時(shí)關(guān)閉,然后從某一部分開始,如下:
  //din.on(false);
  int b;
  while((b=din.read())!=-1){
   //做一些對(duì)文件的處理
   //if(b=='$') din.on(true); //當(dāng)碰到文件中的符號(hào)$時(shí)才開始計(jì)算
  }
  byte[] re = md.digest();//獲得消息摘要
  //下面把消息摘要轉(zhuǎn)換為字符串
  String result = "";
  for(int i=0;i<re.length;i++){
   result += Integer.toHexString((0x000000ff&re[i])0xffffff00).substring(6);
  }
  System.out.println(result);
 }
}
  當(dāng)A和B通信時(shí),A將數(shù)據(jù)傳給B時(shí),同時(shí)也將數(shù)據(jù)的消息摘要傳給B,B收到后可以用該消息摘要驗(yàn)證A傳的消息是否正確。這時(shí)會(huì)產(chǎn)生問題,即若傳遞過程中別人修改了數(shù)據(jù)時(shí),同時(shí)也修改了消息摘要。B就無法確認(rèn)數(shù)據(jù)是否正確。消息驗(yàn)證碼可以解決這一問題。

  使用消息驗(yàn)證碼的前提是 A和B雙方有一個(gè)共同的密鑰,這樣A可以將數(shù)據(jù)計(jì)算出來的消息摘要加密后發(fā)給B,以防止消息摘要被改。由于使用了共同的密鑰,所以稱為“驗(yàn)證碼”。

  例、下面的程序即可利用共同的密鑰來計(jì)算消息摘要的驗(yàn)證碼

package com.mac;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class MyMac {
 public static void main(String[] args) throws Exception{
  //這是一個(gè)消息摘要串
  String str="TestString";
  //共同的密鑰編碼,這個(gè)可以通過其它算法計(jì)算出來
  byte[] kb={11,105,-119,50,4,-105,16,38,-14,-111,21,-95,70,-15,76,-74,
    67,-88,59,-71,55,-125,104,42};
  //獲取共同的密鑰
  SecretKeySpec k = new SecretKeySpec(kb,"HMACSHA1");
  //獲取Mac對(duì)象
  Mac m = Mac.getInstance("HmacMD5");
  m.init(k);
  m.update(str.getBytes("UTF-8"));
  byte[] re = m.doFinal();//生成消息碼
  //下面把消息碼轉(zhuǎn)換為字符串
  String result = "";
  for(int i=0;i<re.length;i++){
   result += Integer.toHexString((0x000000ff&re[i])0xffffff00).substring(6);
  }
  System.out.println(result);
 }
}
  使用以上兩種技術(shù)可以保證數(shù)據(jù)沒有經(jīng)過改變,但接收者還無法確定數(shù)據(jù)是否確實(shí)是某個(gè)人發(fā)來的。盡管消息碼可以確定數(shù)據(jù)是某個(gè)有同樣密鑰的人發(fā)來的,但這要求雙方具有共享的密鑰,若有一組用戶共享,我們就無法確定數(shù)據(jù)的來源了。

  數(shù)字簽名可以解決這一問題。數(shù)字簽名利用非對(duì)稱加密技術(shù),發(fā)送者使用私鑰加密數(shù)據(jù)產(chǎn)生的消息摘要(簽名),接收者使用發(fā)送者的公鑰解密消息摘要以驗(yàn)證簽名是否是某個(gè)人的。由于私鑰只有加密者才有,因此假如接收者用某個(gè)公鑰解密了某個(gè)消息摘要,就可以確定這段消息摘要必然是對(duì)應(yīng)的私鑰持有者發(fā)來的。

  使用數(shù)字簽名的前提是接收數(shù)據(jù)者能夠確信驗(yàn)證簽名時(shí)(用發(fā)送者的私鑰加密消息摘要)所用的公鑰確實(shí)是某個(gè)人的 (因?yàn)橛锌赡苡腥思俑婀€)。數(shù)字證書可以解決這個(gè)問題。

  數(shù)字證書含有兩部分?jǐn)?shù)據(jù):一部分是對(duì)應(yīng)主體(單位或個(gè)人)的信息,另一部分是這個(gè)主體所對(duì)應(yīng)的公鑰。即數(shù)字證書保存了主體和它的公鑰的一一對(duì)應(yīng)關(guān)系。同樣,數(shù)字證書也有可能被假造,如何判定數(shù)字證書的內(nèi)容的真實(shí)性呢?所以,有效的數(shù)字證書必須經(jīng)過權(quán)威 CA的簽名,即權(quán)威CA驗(yàn)證數(shù)字證書的內(nèi)容的真實(shí)性,然后再在數(shù)字證書上使用自己的私鑰簽名(相當(dāng)于在證書加章確認(rèn))。

  這樣,當(dāng)用戶收到這樣的數(shù)字證書后,會(huì)用相應(yīng)的權(quán)威 CA的公鑰驗(yàn)證該證書的簽名(因?yàn)闄?quán)威的CA的公鑰在操作系統(tǒng)中己經(jīng)安裝)。根據(jù)非對(duì)稱加密的原理,假如該證書不是權(quán)威CA簽名的,將不能通過驗(yàn)證,即該證書是不可靠的。

  若通過驗(yàn)證,即可證實(shí)此證書含的信息(發(fā)信人的公鑰和信息)是無誤的。于是可以信任該證書,便可以通過該證書內(nèi)含的公鑰來確認(rèn)數(shù)據(jù)確實(shí)是發(fā)送者發(fā)來的。

  于是,雙方通信時(shí), A把數(shù)據(jù)的消息摘要用自己的私鑰加密(即簽名),然后把自己的數(shù)字證書和數(shù)據(jù)及簽名后的消息摘要一起發(fā)送給B,B處查看A的數(shù)字證書,假如A的數(shù)字證書是經(jīng)過權(quán)威CA驗(yàn)證可靠的,便信任A,便可使用A的數(shù)字證書中附帶的A的公鑰解密消息摘要(這一過程同時(shí)確認(rèn)了發(fā)送數(shù)據(jù)的人又可以解密消息摘要),然后通過解密后的消息摘要驗(yàn)證數(shù)據(jù)是否正確無誤沒被修改。

  利用這一原理,我們可以突破 java的applet小程序在瀏覽器中的權(quán)限,由于默認(rèn)的applet權(quán)限控制不答應(yīng)它訪問操作系統(tǒng)級(jí)的一切。于是我們可以用我們數(shù)字證書來給applet簽名,然后客戶端收到該applet時(shí),系統(tǒng)會(huì)自動(dòng)查看給該applet簽名的數(shù)字證書并提供給終端用戶判定是否信認(rèn)該數(shù)字證書,假如用戶信認(rèn),則該applet便有了訪問系統(tǒng)的權(quán)限。 二、 Java中的數(shù)字證書的生成及維護(hù)方法

  Java中的keytool.exe可以用來創(chuàng)建數(shù)字證書,所有的數(shù)字證書是以一條一條(采用別名區(qū)別)的形式存入證書庫(kù)的中,證書庫(kù)中的一條證書包含該條證書的私鑰,公鑰和對(duì)應(yīng)的數(shù)字證書的信息。證書庫(kù)中的一條證書可以導(dǎo)出數(shù)字證書文件,數(shù)字證書文件只包括主體信息和對(duì)應(yīng)的公鑰。

  每一個(gè)證書庫(kù)是一個(gè)文件組成,它有訪問密碼,在首次創(chuàng)建時(shí),它會(huì)自動(dòng)生成證書庫(kù),并要求指定訪問證書庫(kù)的密碼。

  在創(chuàng)建證書的的時(shí)候,需要填寫證書的一些信息和證書對(duì)應(yīng)的私鑰密碼。這些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它們的意思是:

  CN(Common Name名字與姓氏)

  OU(Organization Unit組織單位名稱)

  O(Organization組織名稱)

  L(Locality城市或區(qū)域名稱)

  ST(State州或省份名稱)

  C(Country國(guó)家名稱)

  可以采用交互式讓工具提示輸入以上信息,也可以采用參數(shù)

-dname "CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"來自動(dòng)創(chuàng)建。

  1、示例

  如下所示一句采用交互式創(chuàng)建一個(gè)證書,指定證書庫(kù)為 abnerCALib,創(chuàng)建別名為abnerCA的一條證書,它指定用RSA算法生成,

  且指定密鑰長(zhǎng)度為 1024,證書有效期為3650天:


  如下圖所示:


  上圖中最后一步,我們輸入的是 CN,代表中國(guó)的縮寫,也可以直接輸入“中國(guó)”兩個(gè)字。

  2、證書的操作方法

  ● 證書的顯示

  如:


  將顯示 abnerCALib證書庫(kù)的的所有證書列表:如下圖示:


  又如: keytool -list -alias abnerCA -keystore abnerCALib

  將顯示 abnerCALib證書庫(kù)中別名為abnerCA的證書的信息。如下圖所示:


  又如: keytool -list -v -alias abnerCA -keystore abnerCALib

  將顯示證書的具體信息( -v參數(shù))如下圖所示:

Java安全通信、數(shù)字證書及應(yīng)用實(shí)踐(圖一)
點(diǎn)擊查看大圖


  ● 將證書導(dǎo)出到證書文件

  如: keytool -eXPort -alias abnerCA -file abnerCA.cer -keystore abnerCALib
  將把證書庫(kù) abnerCALib中的別名為abnerCA的證書導(dǎo)出到abnerCA.cer證書文件中,

  它包含證書主體的信息及證書的公鑰,不包括私鑰,可以公開,如下圖所示 :


  上面導(dǎo)出的證書文件是以二進(jìn)制編碼文件,無法用文本編輯器正確顯示,因此不利用公布證書,可以加上 -rfc參數(shù)以一種可打印的編者編碼輸出。

  如:

keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib -storepass 100200 –rfc
  這個(gè)命令在命令行中指定了證書庫(kù)的訪問密碼,同時(shí)指定以可查看編碼的方式輸出。
 
  3、通過證書文件查看證書的信息

  通過命令 :keytool –printcert –file abnerCA.cer可以查看證書文件的信息。

  也可以在 windows中雙擊產(chǎn)生的證書文件直接查看。

  ● 證書條目的刪除

  keytool的命令行參數(shù)-delete可以刪除密鑰庫(kù)中的條目,如:

keytool -delete -alias abnerCA -keystore abnerCALib  
  這條命令將 abnerCALib庫(kù)中的abnerCA這一條證書刪除了。

  ● 證書條目口令的修改

  如:

keytool –keypasswd –alias abnerCA –keystore abnerCALib
  可以以交互的方式修改 abnerCALib證書庫(kù)中的條目為abnerCA的證書。

Keytool –keypasswd –alias abnerCA –keypass 123456 –new 200100 –storepass 1002 00 –keystore abnerCALib



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永昌县| 城市| 富宁县| 昌邑市| 南溪县| 成武县| 濉溪县| 全州县| 嘉祥县| 佳木斯市| 雷山县| 江山市| 永安市| 运城市| 关岭| 祥云县| 那曲县| 漳平市| 平泉县| 北碚区| 卓资县| 冕宁县| 深州市| 都江堰市| 兴和县| 吴江市| 金乡县| 临沭县| 余干县| 光山县| 海盐县| 临清市| 涞水县| 巨鹿县| 夏邑县| 彩票| 鹿泉市| 青州市| 偃师市| 铅山县| 射阳县|