国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號(hào)

對(duì)等計(jì)算實(shí)踐: P2P 遇上 SSL
2005-12-02   

對(duì)任何重要的 P2P 應(yīng)用程序而言,對(duì)等機(jī)之間的安全通信都是一個(gè)核心要求。盡管安全的細(xì)節(jié)依賴于如何使用該應(yīng)用程序和該應(yīng)用程序?qū)⒁Wo(hù)什么,但通過使用現(xiàn)有技術(shù),例如 SSL 實(shí)現(xiàn)強(qiáng)壯的、一般用途的安全通常是可能的。本月,Todd Sundsted 演示如何在 P2P 安全中使用 SSL(通過 JSSE)。

我們考察了 p2p 應(yīng)用程序中的信任角色。信任的等級(jí)是衡量我們確信程度的尺度,即我們正與之通信的人是否是我們以為的那個(gè)人,以及我們正訪問的資源是否是我們以為的那些。我們也研究了用于在所有分布式應(yīng)用程序,包括 p2p 應(yīng)用程序中建立信任的三個(gè)構(gòu)件:認(rèn)證、授權(quán)和加密。

現(xiàn)在我們將通過修改我們的簡單 p2p 應(yīng)用程序把上個(gè)月的課程應(yīng)用到實(shí)踐中。特別地,我們將用 X.509 證書擴(kuò)展該應(yīng)用以支持 P2P 認(rèn)證和加密。我們將在將來的文章中處理授權(quán)問題。

安全認(rèn)證
一個(gè)應(yīng)用程序的安全需求在很大程度上依賴于將如何使用該應(yīng)用程序和該應(yīng)用程序?qū)⒁Wo(hù)什么。不過,用現(xiàn)有技術(shù)實(shí)現(xiàn)強(qiáng)大的、一般用途的安全通常是可能的。認(rèn)證就是一個(gè)很好的示例。

當(dāng)顧客想從 Web 站點(diǎn)購買某個(gè)產(chǎn)品時(shí),顧客和 Web 站點(diǎn)都要進(jìn)行認(rèn)證。顧客通常是以提供名字和密碼的方式來認(rèn)證他自己。另一方面,Web 站點(diǎn)通過交換一塊簽名數(shù)據(jù)和一個(gè)有效的 X.509 證書(作為 SSL 握手的一部分)來認(rèn)證它自己。顧客的瀏覽器驗(yàn)證該證書并用所附的公用密鑰驗(yàn)證簽名數(shù)據(jù)。一旦雙方都認(rèn)證了,則交易就可以開始了。

SSL 能用相同的機(jī)制處理服務(wù)器認(rèn)證(就如在上面的示例中)和客戶機(jī)認(rèn)證。Web 站點(diǎn)典型地對(duì)客戶機(jī)認(rèn)證不依賴 SSL ― 要求用戶提供密碼是較容易的。而 SSL 客戶機(jī)和服務(wù)器認(rèn)證對(duì)于透明認(rèn)證是完美的,對(duì)等機(jī) ― 如 p2p 應(yīng)用程序中的對(duì)等機(jī)之間一定會(huì)發(fā)生透明認(rèn)證。

安全套接字層(Secure Sockets Layer(SSL)) SSL 是一種安全協(xié)議,它為網(wǎng)絡(luò)(例如因特網(wǎng))的通信提供私密性。SSL 使應(yīng)用程序在通信時(shí)不用擔(dān)心被竊聽和篡改。

SSL 實(shí)際上是共同工作的兩個(gè)協(xié)議:“SSL 記錄協(xié)議”(SSL Record Protocol)和“SSL 握手協(xié)議”(SSL Handshake Protocol)。“SSL 記錄協(xié)議”是兩個(gè)協(xié)議中較低級(jí)別的協(xié)議,它為較高級(jí)別的協(xié)議,例如 SSL 握手協(xié)議對(duì)數(shù)據(jù)的變長的記錄進(jìn)行加密和解密。SSL 握手協(xié)議處理應(yīng)用程序憑證的交換和驗(yàn)證。

當(dāng)一個(gè)應(yīng)用程序(客戶機(jī))想和另一個(gè)應(yīng)用程序(服務(wù)器)通信時(shí),客戶機(jī)打開一個(gè)與服務(wù)器相連接的套接字連接。然后,客戶機(jī)和服務(wù)器對(duì)安全連接進(jìn)行協(xié)商。作為協(xié)商的一部分,服務(wù)器向客戶機(jī)作自我認(rèn)證。客戶機(jī)可以選擇向服務(wù)器作或不作自我認(rèn)證。一旦完成了認(rèn)證并且建立了安全連接,則兩個(gè)應(yīng)用程序就可以安全地進(jìn)行通信。按照慣例,我將把發(fā)起該通信的對(duì)等機(jī)看作客戶機(jī),另一個(gè)對(duì)等機(jī)則看作服務(wù)器,不管連接之后它們充當(dāng)什么角色。

在 Java 應(yīng)用程序如何使用 SSL
用于 Java 應(yīng)用程序的 SSL 由“Java 安全套接字?jǐn)U展”(Java Secure Socket Extension(JSSE))提供。JSSE 是最近發(fā)布的 JDK 1.4 Beta 測試版的一個(gè)標(biāo)準(zhǔn)部件,但對(duì)早些版本的 Java 平臺(tái)它是作為一個(gè)擴(kuò)展可用的。

JSSE 用 SSL 作它的安全套接字的底層機(jī)制。JSSE 安全套接字除了支持透明認(rèn)證和加密之外,其工作方式與常規(guī)套接字相似。因?yàn)樗鼈兛雌饋硪才c普通套接字(它們是類 和類 的子類)相似,所以使用 JSSE 的多數(shù)代碼不用修改。受到影響最多的代碼是那些處理安全套接字工廠(secure socket factory)的創(chuàng)建和初始化的代碼。

如果您想在早于版本 1.4 的 Java 平臺(tái)中使用 JSSE,那么您將不得不自己去下載并安裝 JSSE 擴(kuò)展。安裝說明非常簡單,所以我不想在這里重復(fù)。

模型
圖 1 說明在對(duì)等機(jī)之間的通信中 SSL 將充當(dāng)?shù)慕巧?/p>

圖 1. 工作中的 SSL
圖 1. 工作中的 SSL

名為 A 和 B 的兩臺(tái)對(duì)等機(jī)想安全地進(jìn)行通信。 在我們簡單的 p2p 應(yīng)用程序的環(huán)境中,對(duì)等機(jī) A 想查詢對(duì)等機(jī) B 上的一個(gè)資源。

每個(gè)對(duì)等機(jī)都有包含其專用密鑰的一個(gè)數(shù)據(jù)庫(名為 keystore)和包含其公用密鑰的證書。密碼保護(hù)數(shù)據(jù)庫的內(nèi)容。該數(shù)據(jù)庫還包含一個(gè)或多個(gè)來自被信任的對(duì)等機(jī)的自簽名證書。

對(duì)等機(jī) A 發(fā)起這項(xiàng)事務(wù),每臺(tái)對(duì)等機(jī)相互認(rèn)證,兩臺(tái)對(duì)等機(jī)協(xié)商采用的密碼及其長度并建立一個(gè)安全通道。完成這些操作之后,每個(gè)對(duì)等機(jī)都知道它正在跟誰交談并且知道通道是安全的。

初始化
因?yàn)?JSSE 和 SSL 的介紹對(duì)初始化代碼有很大影響,所以讓我們來考察對(duì)等機(jī) A 中負(fù)責(zé)初始化的代碼。

清單 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 = trustmanagerfactory.getTrustManagers();

   // Create SSL context.
   SSLContext sslcontext = SSLContext.getInstance("SSL");
   SecureRandom securerandom = SecureRandom.getInstance("SHA1PRNG");
   sslcontext.init(arkeymanager, artrustmanager, securerandom);

   // Create factories.
   m_socketfactory = sslcontext.getSocketFactory();
   m_serversocketfactory = sslcontext.getServerSocketFactory();
   m_keystore = keystore;

當(dāng)用戶第一次啟動(dòng)應(yīng)用程序時(shí),應(yīng)用程序提示輸入一個(gè)身份(別名)和一個(gè)密碼。身份只用于對(duì)對(duì)等機(jī)進(jìn)行本地識(shí)別 ― 它沒有全局意義。應(yīng)用程序生成一個(gè)隨機(jī)的 128 位(16 字節(jié))的字符串,應(yīng)用程序用這個(gè)字符串對(duì)對(duì)等機(jī)進(jìn)行全局識(shí)別并將它轉(zhuǎn)換成字母數(shù)字字符串。應(yīng)用程序用身份、密碼和名字創(chuàng)建 keystore 和公開/專用密鑰對(duì),密鑰對(duì)存儲(chǔ)在 keystore 中。密碼保護(hù) keystore 中的信息。

我確信您已經(jīng)注意到我創(chuàng)建初始 keystore 時(shí)采取的辦法。應(yīng)用程序把 keytool 啟動(dòng)為一個(gè)外部進(jìn)程,keytool 創(chuàng)建 keystore。我不得不這樣做,因?yàn)楣驳?Java 安全 API 不提供創(chuàng)建證書的工具 ― 這些功能隱藏在 JSSE 中,它的 API 未發(fā)布。啟動(dòng) keytool 來創(chuàng)建 keystore 的最大缺點(diǎn)是要冒用戶提供的密碼被公開的風(fēng)險(xiǎn),用戶提供的密碼作為參數(shù)列表的一部分被傳遞進(jìn)去。

應(yīng)用程序創(chuàng)建了 keystore 之后,就打開 keystore 并將它裝入內(nèi)存(如果我們已經(jīng)能夠直接創(chuàng)建 keystore,則我們就可以免去這一步驟)。應(yīng)用程序從 keystore 創(chuàng)建一個(gè) 密鑰管理器(key manager)和一個(gè) 信任管理器(trust manager)。密鑰管理器管理密鑰,這些密鑰用于在安全套接字對(duì)面相對(duì)應(yīng)用程序的對(duì)等機(jī)來認(rèn)證它。信任管理器管理證書,這些證書用于對(duì)位于安全套接字另一端的對(duì)等機(jī)進(jìn)行認(rèn)證。

最后,應(yīng)用程序創(chuàng)建一個(gè) 實(shí)例,這個(gè)實(shí)例充當(dāng)安全套接字工廠的工廠。應(yīng)用程序創(chuàng)建 類的安全版本并將它們用于稍后的通信。

用戶界面
余下代碼的大部分跟我們的前發(fā)行版是相同的。這是 JSSE 帶來的好處之一 ― 用 JSSE 創(chuàng)建的安全套接字看起來和常規(guī)套接字相似,工作起來也和常規(guī)套接字相似。支持代碼也沒什么不同(除了創(chuàng)建和初始化代碼必須修改外)。然而,還是有和用戶界面有關(guān)的改動(dòng)。大部分這些改動(dòng)是受到了我想讓這個(gè)應(yīng)用程序?qū)δ切┲幌肟焖俚卦O(shè)置這個(gè)應(yīng)用程序來試驗(yàn)的愿望而激發(fā)的。

作為對(duì)讀者反饋的回應(yīng),我改善了命令行界面。對(duì)等機(jī)及其資源存在于一個(gè)層次結(jié)構(gòu)中,用戶用命令 lscd訪問這個(gè)結(jié)構(gòu)。 ls 命令列出層次結(jié)構(gòu)中某個(gè)特定點(diǎn)的內(nèi)容(與 UNIX 的 ls 命令或 DOS 的 dir命令所做的相似), cd 命令改變層次結(jié)構(gòu)中的當(dāng)前位置(再一次與 UNIX 和 DOS 中的同名命令相似)。 cd ..用于在層次結(jié)構(gòu)中進(jìn)行回退。

為使應(yīng)用程序更容易使用,我已經(jīng)創(chuàng)建了兩個(gè) zip 文件,每一個(gè)都包含該應(yīng)用程序的一個(gè)已經(jīng)適當(dāng)配置了的實(shí)例。一個(gè)實(shí)例在端口 7776 進(jìn)行通信,另一個(gè)在端口 7777。它們也都已被配置成彼此認(rèn)證,為的是能夠建立安全通道。這些 zip 文件的名稱為 peerA.zip 和 peerB.zip。“自述文件”(README)提供了更多詳細(xì)的使用說明。

結(jié)束語
在 p2p 應(yīng)用程序中加入 SSL 是提供簡單卻強(qiáng)大的安全的極好辦法。我們將繼續(xù)我們的 P2P 之旅,考察更成熟的對(duì)等機(jī)發(fā)現(xiàn)方法。


熱詞搜索:

上一篇:配置Tomcat 4使用SSL
下一篇:SSL的實(shí)際運(yùn)作過程

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
日韩写真欧美这视频| 91看片淫黄大片一级在线观看| 欧美日韩五月天| 国产高清亚洲一区| 亚洲最大色网站| 久久网这里都是精品| 色哟哟亚洲精品| 国内外成人在线视频| 一区二区三区在线观看欧美| 亚洲图片欧美色图| 91黄色免费网站| 经典三级一区二区| 亚洲激情中文1区| 国产三级久久久| 欧美无乱码久久久免费午夜一区| 韩国av一区二区三区在线观看| 亚洲欧美日韩电影| ...xxx性欧美| 99天天综合性| 国内久久精品视频| 日本视频免费一区| 香蕉久久夜色精品国产使用方法| 国产精品妹子av| 日韩毛片高清在线播放| 亚洲三级理论片| 一区二区三区在线视频免费观看 | 亚洲欧洲成人自拍| 综合激情网...| 亚洲欧美另类久久久精品| ...xxx性欧美| 亚洲国产精品久久久久婷婷884| 亚洲精品国产a| 日韩精品1区2区3区| 九色|91porny| 粉嫩在线一区二区三区视频| 99re亚洲国产精品| 欧美色综合影院| 精品国产亚洲一区二区三区在线观看| 在线综合亚洲欧美在线视频| 国产亚洲一本大道中文在线| 中文字幕乱码亚洲精品一区| 亚洲成人av一区二区三区| 看国产成人h片视频| 大美女一区二区三区| 在线观看视频一区二区欧美日韩| 9191成人精品久久| 亚洲欧美激情在线| 极品销魂美女一区二区三区| 91小视频免费看| 久久精品亚洲国产奇米99| 亚洲第一搞黄网站| 成人av网址在线| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲精品乱码久久久久久久久| 国产美女娇喘av呻吟久久| 欧美亚洲综合在线| 国产精品久久久久aaaa| 国内偷窥港台综合视频在线播放| 日本高清不卡在线观看| 中文字幕中文在线不卡住| 精品一区二区三区在线视频| 欧洲一区二区三区在线| 一区二区欧美精品| 在线观看亚洲成人| 国内欧美视频一区二区 | 欧美激情在线看| av午夜一区麻豆| 2023国产精品| 美女视频黄久久| 56国语精品自产拍在线观看| 日本一区二区动态图| 美腿丝袜在线亚洲一区| 91女人视频在线观看| 国产调教视频一区| 国产一区二区影院| 久久一留热品黄| 日本中文字幕一区二区有限公司| 日韩视频中午一区| 国产高清精品网站| 亚洲欧美日本在线| 91精品国产福利| 国产精品69毛片高清亚洲| 久久婷婷久久一区二区三区| k8久久久一区二区三区| 亚洲一区二区欧美| 日韩亚洲电影在线| 色综合久久久久| 国产麻豆精品久久一二三| 国产精品美女久久久久久久久久久| 在线亚洲一区二区| 风间由美一区二区三区在线观看| 视频一区二区国产| 欧美视频精品在线| 国内精品国产三级国产a久久| 免费在线观看精品| 丁香婷婷深情五月亚洲| 国产精品一二三| 美女一区二区视频| 热久久久久久久| 午夜精品久久久久| 亚洲欧美日韩国产手机在线 | 国产精品日韩成人| 国产日本欧美一区二区| 欧美激情在线一区二区| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美挠脚心视频网站| 欧美在线观看一区| 欧美无乱码久久久免费午夜一区 | 欧美一区二区三区日韩| 欧美中文字幕一区二区三区亚洲| 顶级嫩模精品视频在线看| 国产一区二区三区| 国产不卡在线视频| 不卡的看片网站| 99视频一区二区三区| www.视频一区| 欧洲亚洲精品在线| 欧美日韩成人高清| 91精品国产免费| 久久色视频免费观看| 国产精品伦一区| 天天综合色天天综合| 国产成人精品一区二区三区四区 | 91视频在线看| 91网站在线播放| 91精品国产综合久久久蜜臀图片| 精品区一区二区| 亚洲欧洲另类国产综合| 日韩av中文在线观看| 国产91精品久久久久久久网曝门| 欧美性欧美巨大黑白大战| 久久一夜天堂av一区二区三区| 亚洲视频电影在线| 久久99精品久久久久久国产越南 | 久久嫩草精品久久久精品| 亚洲日本乱码在线观看| 久久国产尿小便嘘嘘尿| 色婷婷av一区二区三区软件| 久久久久一区二区三区四区| 亚洲成人你懂的| 91在线码无精品| 国产欧美一区二区精品性色| 日韩高清电影一区| 欧美日韩成人一区| 亚洲大片一区二区三区| 色呦呦国产精品| 国产精品女同一区二区三区| 国产99精品视频| 国产精品水嫩水嫩| 成人小视频免费观看| 久久精品亚洲麻豆av一区二区| 久草热8精品视频在线观看| 日韩一级完整毛片| 日韩高清中文字幕一区| 欧美v日韩v国产v| 精品在线观看免费| 日本一区二区视频在线| gogo大胆日本视频一区| 一区二区三区高清不卡| 欧美午夜片在线观看| 欧美日韩aaaaaa| 午夜电影久久久| 7777精品伊人久久久大香线蕉最新版| 亚洲精品日产精品乱码不卡| 在线欧美日韩国产| 蜜臀av性久久久久蜜臀aⅴ四虎 | 波多野结衣中文一区| 亚洲自拍欧美精品| 欧美一级日韩一级| 国产98色在线|日韩| 亚洲乱码中文字幕综合| 日韩午夜av电影| 色综合久久久久综合| 国模大尺度一区二区三区| 国产精品视频yy9299一区| 色综合久久综合| 国产一区二区免费看| 亚洲精选视频在线| 久久久久九九视频| 国产91在线|亚洲| 日韩电影网1区2区| 亚洲色图清纯唯美| 久久久久久免费| 日韩精品一区二区三区视频播放| 91免费视频观看| 成人精品小蝌蚪| 国产精品一区二区黑丝| 美女一区二区久久| 偷窥少妇高潮呻吟av久久免费| 国产精品久久久久久久久动漫 | 精品国产欧美一区二区| 欧美日韩在线直播| 欧美日韩国产一级| 91社区在线播放| 91在线看国产| 欧美日韩一级片在线观看| 精品污污网站免费看| 欧美午夜视频网站| 欧美体内she精视频| 在线成人av影院|