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

首頁 > 學院 > 開發(fā)設計 > 正文

對等計算實踐:P2P遇上SSL

2019-11-18 12:18:35
字體:
供稿:網(wǎng)友

  對任何重要的 P2P 應用程序而言,對等機之間的安全通信都是一個核心要求。盡管安全的細節(jié)依靠于如何使用該應用程序和該應用程序?qū)⒁Wo什么,但通過使用現(xiàn)有技術(shù),例如 SSL 實現(xiàn)強壯的、一般用途的安全通常是可能的。本月,Todd Sundsted 演示如何在 P2P 安全中使用 SSL(通過 JSSE)。
  上月我們考察了 p2p 應用程序中的信任角色。信任的等級是衡量我們確信程度的尺度,即我們正與之通信的人是否是我們以為的那個人,以及我們正訪問的資源是否是我們以為的那些。我們也研究了用于在所有分布式應用程序,包括 p2p 應用程序中建立信任的三個構(gòu)件:認證、授權(quán)和加密。
  
  現(xiàn)在我們將通過修改我們的簡單 p2p 應用程序把上個月的課程應用到實踐中。非凡地,我們將用 X.509 證書擴展該應用以支持 P2P 認證和加密。我們將在將來的文章中處理授權(quán)問題。
  
  安全認證
  一個應用程序的安全需求在很大程度上依靠于將如何使用該應用程序和該應用程序?qū)⒁Wo什么。不過,用現(xiàn)有技術(shù)實現(xiàn)強大的、一般用途的安全通常是可能的。認證就是一個很好的示例。
  
  當顧客想從 Web 站點購買某個產(chǎn)品時,顧客和 Web 站點都要進行認證。顧客通常是以提供名字和密碼的方式來認證他自己。另一方面,Web 站點通過交換一塊簽名數(shù)據(jù)和一個有效的 X.509 證書(作為 SSL 握手的一部分)來認證它自己。顧客的瀏覽器驗證該證書并用所附的公用密鑰驗證簽名數(shù)據(jù)。一旦雙方都認證了,則交易就可以開始了。
  
  SSL 能用相同的機制處理服務器認證(就如在上面的示例中)和客戶機認證。Web 站點典型地對客戶機認證不依靠 SSL ? 要求用戶提供密碼是較輕易的。而 SSL 客戶機和服務器認證對于透明認證是完美的,對等機 ? 如 p2p 應用程序中的對等機之間一定會發(fā)生透明認證。
  
  安全套接字層(Secure Sockets Layer(SSL))
  SSL 是一種安全協(xié)議,它為網(wǎng)絡(例如因特網(wǎng))的通信提供私密性。SSL 使應用程序在通信時不用擔心被竊聽和篡改。
  
  SSL 實際上是共同工作的兩個協(xié)議:“SSL 記錄協(xié)議”(SSL Record PRotocol)和“SSL 握手協(xié)議”(SSL Handshake Protocol)。“SSL 記錄協(xié)議”是兩個協(xié)議中較低級別的協(xié)議,它為較高級別的協(xié)議,例如 SSL 握手協(xié)議對數(shù)據(jù)的變長的記錄進行加密和解密。SSL 握手協(xié)議處理應用程序憑證的交換和驗證。
  
  當一個應用程序(客戶機)想和另一個應用程序(服務器)通信時,客戶機打開一個與服務器相連接的套接字連接。然后,客戶機和服務器對安全連接進行協(xié)商。作為協(xié)商的一部分,服務器向客戶機作自我認證。客戶機可以選擇向服務器作或不作自我認證。一旦完成了認證并且建立了安全連接,則兩個應用程序就可以安全地進行通信。請參閱參考資料以獲得更多有關(guān) SSL 的信息。
  
  按照慣例,我將把發(fā)起該通信的對等機看作客戶機,另一個對等機則看作服務器,不管連接之后它們充當什么角色。
  
  java 應用程序如何使用 SSL
  用于 Java 應用程序的 SSL 由“Java 安全套接字擴展”(Java Secure Socket Extension(JSSE))提供。JSSE 是最近發(fā)布的 JDK 1.4 Beta 測試版的一個標準部件,但對早些版本的 Java 平臺它是作為一個擴展可用的。
  
  JSSE 用 SSL 作它的安全套接字的底層機制。JSSE 安全套接字除了支持透明認證和加密之外,其工作方式與常規(guī)套接字相似。因為它們看起來也與普通套接字(它們是類 java.net.Socket 和類 java.net.ServerSocket 的子類)相似,所以使用 JSSE 的多數(shù)代碼不用修改。受到影響最多的代碼是那些處理安全套接字工廠(secure socket factory)的創(chuàng)建和初始化的代碼。
  
  假如您想在早于版本 1.4 的 Java 平臺中使用 JSSE,那么您將不得不自己去下載并安裝 JSSE 擴展(請參閱參考資料)。安裝說明非常簡單,所以我不想在這里重復。
  
  名為 A 和 B 的兩臺對等機想安全地進行通信。 在我們簡單的 p2p 應用程序的環(huán)境中,對等機 A 想查詢對等機 B 上的一個資源。
  
  每個對等機都有包含其專用密鑰的一個數(shù)據(jù)庫(名為 keystore)和包含其公用密鑰的證書。密碼保護數(shù)據(jù)庫的內(nèi)容。該數(shù)據(jù)庫還包含一個或多個來自被信任的對等機的自簽名證書。
  
  對等機 A 發(fā)起這項事務,每臺對等機相互認證,兩臺對等機協(xié)商采用的密碼及其長度并建立一個安全通道。完成這些操作之后,每個對等機都知道它正在跟誰交談并且知道通道是安全的。
  
  初始化
  因為 JSSE 和 SSL 的介紹對初始化代碼有很大影響,所以讓我們來考察對等機 A 中負責初始化的代碼。
  
  清單 1. 安全初始化代碼
  // Each peer has an identity that must be locally (but not globally)
  // unique. This identity and its associated public and private keys
  // are stored in a keystore and protected by a passWord. Each
  // peer also has a name that must be globally unique.
  String stringIdentity = null;
  String stringPassword = null;
  String stringName = null;
  
  // The code that prompts the user for his/her identity
  // and password goes here. the user´s name is
  // generated (if necessary) later.
  
  // Create home Directory. This is a very portable way
  // to create a home directory, but it has its problems --
  // the various flavors of Microsoft Windows put the directory
  // in widely different locations in the directory hierarchy.
  String stringHome = System.getProperty("user.home") + File.separator + "p2p";
  File fileHome = new File(stringHome);
  if (fileHome.exists() == false)
  fileHome.mkdirs();
  
  // Create keystore. We must run an external process to create the
  // keystore, because the security APIs don´t eXPose enough
  // functionality to do this inline. I haven´t tested this widely enough
  // to know how portable this code is, but it works on everything I
  // tried it on.
  String stringKeyStore = stringHome + File.separator + "keystore";
  File fileKeyStore = new File(stringKeyStore);
  if (fileKeyStore.exists() == false)
  {
  System.out.println("Creating keystore...");
  byte [] arb = new byte [16];
  SecureRandom securerandom = SecureRandom.getInstance("SHA1PRNG");
  securerandom.nextBytes(arb);
  stringName = new String(Base64.encode(arb));
  String [] arstringCommand = new String []
  {
  System.getProperty("java.home") + File.separator + "bin" + File.separator + "keytool",
  "-genkey",
  "-alias", stringIdentity,
  "-keyalg", "RSA",
  "-keysize", "1024",
  "-dname", "CN=" + stringName,
  "-keystore", stringHome + File.separator + "keystore",
  "-keypass", stringPassword,
  "-storetype", "JCEKS",
  "-storepass", stringPassword
  };
  Process process = Runtime.getRuntime().exec(arstringCommand);
  process.waitFor();
  InputStream inputstream2 = process.getInputStream();
  IOUtils.copy(inputstream2, System.out);
  InputStream inputstream3 = process.getErrorStream();
  IOUtils.copy(inputstream3, System.out);
  if (process.exitvalue() != 0)
  System.exit(-1);
  }
  
  // Once the application has created/located the keystore, it
  // opens it and creates a KeyStore instance from the data
  // in it.
  char [] archPassword = stringPassword.toCharArray();
  FileInputStream fileinputstream = new FileInputStream(stringHome + File.separator +
  
  "keystore");
  KeyStore keystore = KeyStore.getInstance("JCEKS");
  try
  {
  keystore.load(fileinputstream, archPassword);
  }
  catch (IOException ioexception)
  {
  System.out.println("Cannot load keystore. Password may be wrong.");
  System.exit(-3);
  }
  if (keystore.containsAlias(stringIdentity) == false)
  {
  System.out.println("Cannot locate identity.");
  System.exit(-2);
  }
  
  // Create key manager. The key manager holds this peer´s
  // private key.
  KeyManagerFactory keymanagerfactory = KeyManagerFactory.getInstance("SunX509");
  keymanagerfactory.init(keystore, archPassword);
  KeyManager [] arkeymanager = keymanagerfactory.getKeyManagers();
  
  // Create trust manager. The trust manager hold other peers´
  // certificates.
  TrustManagerFactory trustmanagerfactory = TrustManagerFactory.getInstance("SunX509");
  trustmanagerfactory.init(keystore);
  TrustManager [] artrustmanager = trus

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳城县| 温泉县| 莱芜市| 斗六市| 兰西县| 石狮市| 宁德市| 宁武县| 垣曲县| 东宁县| 木兰县| 宁城县| 大邑县| 泊头市| 东乡族自治县| 宁德市| 南昌市| 中阳县| 万盛区| 凤城市| 舞钢市| 宜君县| 桂平市| 讷河市| 宁远县| 惠水县| 行唐县| 交城县| 乐昌市| 吴江市| 祁门县| 长垣县| 镇远县| 遂昌县| 宁陵县| 大同县| 惠州市| 南岸区| 宁强县| 孟村| 江门市|