麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

2019-11-18 14:28:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
摘要

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

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

   ● 程序間如何安全通信

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

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

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

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

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

  要害字

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

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

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

  消息摘要是對(duì)原始數(shù)據(jù)按照一定算法進(jìn)行計(jì)算得到的結(jié)果,它主要檢測(cè)原始數(shù)據(jù)是否被修改過(guò)。消息摘要與加密不同,加密是對(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ì)算摘要
  //也可以不控制,將全過(guò)程計(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)生問(wèn)題,即若傳遞過(guò)程中別人修改了數(shù)據(jù)時(shí),同時(shí)也修改了消息摘要。B就無(wú)法確認(rèn)數(shù)據(jù)是否正確。消息驗(yàn)證碼可以解決這一問(wèn)題。

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

  例、下面的程序即可利用共同的密鑰來(lái)計(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è)可以通過(guò)其它算法計(jì)算出來(lái)
  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)過(guò)改變,但接收者還無(wú)法確定數(shù)據(jù)是否確實(shí)是某個(gè)人發(fā)來(lái)的。盡管消息碼可以確定數(shù)據(jù)是某個(gè)有同樣密鑰的人發(fā)來(lái)的,但這要求雙方具有共享的密鑰,若有一組用戶共享,我們就無(wú)法確定數(shù)據(jù)的來(lái)源了。

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

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

  數(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)過(guò)權(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簽名的,將不能通過(guò)驗(yàn)證,即該證書是不可靠的。

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

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

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

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

  每一個(gè)證書庫(kù)是一個(gè)文件組成,它有訪問(wèn)密碼,在首次創(chuàng)建時(shí),它會(huì)自動(dòng)生成證書庫(kù),并要求指定訪問(wèn)證書庫(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"來(lái)自動(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)制編碼文件,無(wú)法用文本編輯器正確顯示,因此不利用公布證書,可以加上 -rfc參數(shù)以一種可打印的編者編碼輸出。

  如:

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

  通過(guò)命令 :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ā)表
主站蜘蛛池模板: 亚洲欧美成aⅴ人在线观看 免费看欧美黑人毛片 | 在线看一区二区三区 | 国产高清自拍一区 | 久久国产精品一区 | 久久色播 | 一级黄色片武则天 | 久久人人做| 中国洗澡偷拍在线播放 | www69xxxxx| 亚洲日本欧美 | 黄色片网站免费在线观看 | 一级在线视频 | 久久久一区二区三区精品 | 成人在线视频精品 | 日本一级黄色大片 | 一级在线 | 毛片免费视频播放 | 国产黄色网 | 国产一区视频在线观看免费 | 国产精品www | 亚洲国产高清自拍 | 九九热精品视频在线 | 亚洲综合视频在线播放 | 一级@片 | 久久精品久久久久 | 一级做a爱片久久 | 49vvv| 久久久www成人免费精品 | 欧美毛片在线观看 | 成av人在线观看 | 精品一区二区三区在线观看视频 | 深夜小视频在线观看 | 九色中文字幕 | 91精品国产乱码久久久久久久久 | 3344永久免费 | 精品乱码久久久久 | 欧美日韩中文字幕在线视频 | 国产喷白浆10p | 午夜色片 | 欧美久久久久久久久 | 国产99一区二区 |