《信息安全》課程設計報告--ca系統(tǒng)_第1頁
已閱讀1頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  信息安全課程設計說明書</p><p>  題 目: CA系統(tǒng) </p><p>  學 院: 計算機與信息安全學院 </p><p>  專 業(yè): 姓 名:

2、 </p><p>  學 號: </p><p>  指導教師: </p><p>  年 月 日 </p><p><b>  摘 要</b></p><p&

3、gt;  CA系統(tǒng)是基于數(shù)字證書的一種認證機制,是用于互聯(lián)網(wǎng)通訊中標志互相身份的一種已簽名數(shù)字,數(shù)字證書提供了一種驗證通信雙方的途徑,它的功能相當于我們日常的身份證,還有營業(yè)執(zhí)照之類的。它是基于PKI公鑰基礎設施的一種認證技術,是由一個權威機構CA(Certificate Authority)中心發(fā)布的,又被稱為證書授權機構。數(shù)字證書包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、用戶信息及證書授權中心的信息以及

4、數(shù)字簽名,數(shù)字證書還有一個重要的特征就是只在有效期的時間段內有效。在日常生活中,人們可以通過互相交換證書借助CA認證機構來進行身份識別,特別是在在線購物,如淘寶、京東等,數(shù)字證書對于交易的安全進行起到極其重要的作用。</p><p>  本次課程設計中,首先是利用keysotre生成密鑰庫以及頒發(fā)者自己的證書,這個就充當CA頒發(fā)機構,然后判斷申請用戶是否合法,認證通過后,根據(jù)提交的公鑰,以及個人信息給用戶頒發(fā)數(shù)字

5、證書。</p><p>  【關鍵字】 CA 用戶證書 數(shù)字簽名</p><p><b>  前言</b></p><p>  隨著科技的不斷進步,人們生活水平的不斷提高,電子商務越來越受到當今人們的青睞,如網(wǎng)上簽約、網(wǎng)上購物、網(wǎng)上繳費等。這是因為人們不需要為大筆的現(xiàn)金交易和而頭疼,取而代之的是在線支付,如支付寶、快捷支付,交易的不

6、再是簡單的現(xiàn)金,而是電子現(xiàn)金,更不用大老遠的去實體店購物和參加會議協(xié)商。但也無可避免的帶來的隱患,也就是交易過程中的安全問題,如何保證信息的保密性,如何確定交易者就是本人,如何保證交易達成后雙方不能否認,又如何保證交易信息(如日期)沒有被篡改?于是數(shù)字證書應運而生,數(shù)字安全證書提供了一種在網(wǎng)上驗證身份的方式。安全證書體制主要采用了公開密鑰體制,其它還包括對稱密鑰加密、數(shù)字簽名、數(shù)字信封等技術。數(shù)字證書的加密機制保證了信息的保密性,數(shù)字簽

7、名等技術保證了數(shù)據(jù)的不可修改性,認證機制保證了交易的不可否認性。</p><p>  雖然之前在密碼學課程學習中有接觸過有關數(shù)字證書的知識,但是大部分內容已變得生疏,所以在準備階段,我就先去學校的圖書館瀏覽一些相關電子資源,以及借閱了張明德和劉偉寫的《PKI/CA/數(shù)字證書技術大全》,打算使用Java語言編寫,順便借閱了葉乃文寫的《Java語言程序設計教程》,從以往的碩士論文中可以知道,關于CA系統(tǒng)的設計見仁見智

8、,不過總體上已實現(xiàn)了大體上的自己充當頒發(fā)機構進而進行數(shù)字證書的頒發(fā)。本次課程設計,在已實現(xiàn)的技術基礎上進行功能、數(shù)據(jù)傳輸上的完善,在Java的keytool中生成頒發(fā)機構的keystone以及頒發(fā)者的數(shù)字證書,然后將頒發(fā)者的信息加載,用自己的私鑰對提交的用戶信息以及公鑰進行簽名,生成數(shù)字證書并頒發(fā)給用戶。在用戶信息的提交的過程中,會先對用戶身份進行身份認證,在驗證用戶身份合法之后,才對用戶進行簽名,然后再保存用戶的信息到數(shù)據(jù)庫中。<

9、;/p><p>  另外,在CA系統(tǒng)的設計過程中,考慮到用戶因可能因丟失公鑰而造成損失,所以基于這個隱患而添加了一個用戶證書掛失的功能,這樣就能在很大的程度上減少用戶的損失。在掛失之前會首先核對掛失者的身份是否合法,防止別人惡意的掛失行為,而且,已經掛失的會彈出錯誤提示,避免重復掛失。在掛失之后會把公鑰存入到不受信任的公鑰數(shù)據(jù)庫中,當用戶再次使用該公鑰時會也會彈出錯誤提示。而且,本次CA系統(tǒng)設計中一個人是可以使用多個

10、驗證信息申請多個用戶證書的,這樣就提高了數(shù)字證書用途的廣泛性,而不必受限于數(shù)字證書在不同領域上的使用。</p><p><b>  2. 系統(tǒng)分析</b></p><p><b>  2.1 系統(tǒng)需求</b></p><p>  首先,我們先來看一下靜態(tài)口令身份認證方式的的安全隱患:</p><p>

11、;<b>  口令容易遺失</b></p><p>  用戶名、口令在應用系統(tǒng)中以明文方式傳輸,容易被截取,造成口令遺失,還有輸入口令時被窺視造成口令遺失;用戶名、口令存在數(shù)據(jù)庫中,非法用戶可以通過進入數(shù)據(jù)庫獲取口令信息。</p><p><b>  遺失不容易察覺</b></p><p>  用戶口令遺失后,自己并不知道

12、,不會采取措施防范遺失后可能造成的損失。</p><p>  大量口令需要記憶(不易保管)</p><p>  如果存在多個應用系統(tǒng),可能存在多組用戶名、口令,不方便記憶。</p><p>  然而,在使用數(shù)字證書代替?zhèn)鹘y(tǒng)靜態(tài)口令身份方式具有以下優(yōu)勢:</p><p><b>  權威性:</b></p>

13、<p>  數(shù)字證書設備由CA中心頒發(fā),使用其作為身份識別設備局域哦很高的權威性;</p><p><b>  不可偽造型:</b></p><p>  數(shù)字證書設備經過國家相關部門審核批準,設備中保存的用戶私鑰無法被讀出,不可偽造;</p><p><b>  不容易被冒用:</b></p>&l

14、t;p>  使用證書需要同時持有數(shù)字證書設備和設備啟動口令,缺一不可,因此只要保護好證書設備,他人無法冒用用戶身份;</p><p><b>  不可破解:</b></p><p>  數(shù)字證書設備具有口令保護機制,在連續(xù)輸入錯誤一定次數(shù)后,設備將鎖定,防止暴力破解;</p><p><b>  容易保管:</b>

15、</p><p>  數(shù)字證書設備形狀與普通U盤相似,方便攜帶保管,不易遺失;</p><p><b>  遺失容易發(fā)現(xiàn):</b></p><p>  萬一數(shù)字證書設備遺失,能夠及時發(fā)現(xiàn),并采取相應措施。</p><p>  根據(jù)以上分析,選擇使用數(shù)字證書的身份模式,能夠極大的提高用戶身份的安全性,保障應用系統(tǒng)用戶身份安

16、全。和傳統(tǒng)”用戶名+口令”應用模式,CA具有高強度的通訊方式,能夠實現(xiàn)傳輸數(shù)據(jù)的安全保障,是通過數(shù)字簽名技術實現(xiàn),通過簽名驗證確定數(shù)據(jù)傳輸和存儲的完整性,因為只有授權用戶才能進行解密并使用,所以保證了數(shù)據(jù)的機密性;另外,這是通過數(shù)字簽名技術實現(xiàn)的,因此用戶不得否認簽名操作,即不可否認性。</p><p>  本次課程設計是實現(xiàn)一個簡單的CA頒發(fā)系統(tǒng),基本要求如下:</p><p>  利用

17、Java中的keytool生成的Keystore和CA證書來充當可信任的CA頒發(fā)機構,CA頒發(fā)機構本身是存儲有一定的用戶的認證信息的,然后接受用戶的認證請求,通過用戶的認證信息可以判斷申請用戶是否合法或者用戶的公鑰是否已申請注冊過;</p><p>  認證通過后開始接收用戶信息和用戶自己產生的PublicKey</p><p>  接收完成后,先通過加載CA數(shù)字證書獲得CA頒發(fā)機構的信息

18、以及CA的私鑰,然后對接收到的用戶信息和公鑰進行打包即數(shù)字簽名,生成數(shù)字證書并頒發(fā)給用戶,安全儲存用戶信息;</p><p>  數(shù)字證書吊銷:這里是通過將用戶需要掛失的公鑰存入到不受信任的公鑰數(shù)據(jù)庫中,這樣,該密鑰將被作廢;在掛失前會對掛失用戶進行身份驗證,防止惡意掛失行為,驗證通過后還要訪問一下不受信任的公鑰數(shù)據(jù)庫中是否已存在該公鑰,若已存在則彈出錯誤提示;若不存在,則進行公鑰掛失過程。掛失之后,當用戶再次使

19、用到該公鑰認證時會彈出錯誤提示。</p><p><b>  2.2 數(shù)據(jù)庫連接</b></p><p>  Navicat for MySQL 是一套專為 MySQL 設計的高性能數(shù)據(jù)庫管理及開發(fā)工具。它可以用于任何版本 3.21 或以上的 MySQL 數(shù)據(jù)庫服務器,并支持大部份 MySQL 最新版本的功能,包括觸發(fā)器、存儲過程、函數(shù)、事件、視圖、管理用戶等。<

20、;/p><p>  點擊或選擇文件 -> 新建連接來設置連接屬性。</p><p><b>  連接設置:</b></p><p>  在創(chuàng)建連接后,你可以連接到數(shù)據(jù)庫,管理它的對象、表中的數(shù)據(jù)等。請看下面的幫助,以了解如何用最簡單的方法運行這些操作。</p><p>  與數(shù)據(jù)庫或模式工作:</p>&

21、lt;p>  與數(shù)據(jù)庫或模式的對象工作Navicat 瀏覽器!</p><p>  Navicat 窗口包括一個導覽窗格(左邊的窗格)及一個對象窗格(右邊的窗格)。</p><p>  導覽窗格一個是導覽連接、數(shù)據(jù)庫及數(shù)據(jù)庫對象的基本途徑。它采用樹狀結構,讓你透過彈出菜單快捷及方便地使用數(shù)據(jù)庫和它們的對象。</p><p>  對象窗格顯示開啟表、查詢等。在窗

22、口頂部的工具欄提供其他控制項,你可以用它來操作你的數(shù)據(jù)。</p><p>  navicat如何連接mysql:</p><p>  1、首先你電腦上必須安裝了mysql的數(shù)據(jù)庫。(如果你不清楚自己是否已經安裝成功mysql,你可以在開始菜單輸入“mysql”,進行搜索)</p><p>  2、打開你的Navicat for Mysql(這里也可以使用上面的方法,

23、在開始菜單搜索框中輸入‘navicat’)</p><p>  3、打開后單機工具欄左邊第一個‘connection’,進入連接頁面。</p><p>  4、最重要的一步:打開的界面有五個框需要輸入,第一個:connection Name 需要輸入的是你新建的連接的的名字,這里我們就命名為‘localhost’,第二個:</p><p>  HostName/Ip

24、 Address 你需要輸入的是你本機的ip地址或者直接輸入”localhost”,這里我們選擇第二種。 第三個:Port ,輸入你安裝時候的端口號,一般為默認的3306;第四個和第五個分別為:UserName和Password,意思為你需要輸入你數(shù)據(jù)庫名用戶名和密碼,我的用戶名是:root,密碼:123456。最后把下面那個‘Save Passwod’的小框框給勾上。</p><p>  5、完成上面步驟,然后

25、點擊左下角有個‘testConnectiion’如果彈出success,恭喜你直接點擊右下角的‘save’按鈕就可以了。如果彈出error ,你則需要再重新仔細查看自己哪里填錯了。</p><p>  6、點擊‘save’后,你就可以雙擊“本地”(這里的‘本地’是你剛才輸入的connection Name),然后打開你的數(shù)據(jù)庫了。</p><p><b>  2.3 功能需求&l

26、t;/b></p><p><b>  用戶證書信息設計:</b></p><p>  數(shù)字證書的主要思想是實現(xiàn)對于合法用戶信息的數(shù)字簽名并生成數(shù)字證書,然后頒發(fā)給合法用戶,所以對于數(shù)字證書生成之前需要設計如下信息:</p><p>  版本(Version)</p><p>  版本信息,這個是證書的版本號,不同

27、版本的證書格式是不同的(版本1、版本2、版本3)。這里我用的是V3版本。</p><p>  序列號(Serial Number)</p><p>  證書序列號,同一身份驗證機構簽發(fā)的證書序列號是唯一的,這就是數(shù)字證書的不可</p><p><b>  否認性。</b></p><p>  頒發(fā)者(Issuer)<

28、;/p><p>  頒發(fā)者,也就是CA頒發(fā)機構,指出這個證書是由誰頒發(fā)的;如果是自己所在機構生成的,比如自己所在的公司,那么頒發(fā)者就是自己的公司。</p><p>  簽名算法(Signature Algorithm)</p><p>  簽名算法,指的是對數(shù)字證書進行簽名的時候所使用的算法,可以根據(jù)頒發(fā)者的公鑰進行解密。</p><p>  使

29、用者(Subject)</p><p>  使用者就是證書的持有者,可以是個人、公司、企業(yè)、網(wǎng)站等等需要認證自己身份的個體或者集體。</p><p>  有效期(Valid form begin_date to end_date)</p><p>  證書的有效期就是證書所允許使用的期限,當數(shù)字證書過了有效期將無效,即對于用戶身份的認證將無效,這就需要重新申請數(shù)字證

30、書方能進行通信或者交易。</p><p>  公鑰(Public Key)</p><p>  證書的公鑰,主要是用來對消息進行加密的,這個證書的公鑰是 2048 位的,他的值可以在對話框中看到,是很長的一段十六進制數(shù)。</p><p><b>  指紋和指紋算法</b></p><p>  指紋以及指紋算法,在證書發(fā)布

31、的時候,發(fā)布機構會根據(jù)指紋算法先計算出整個證書的hash值,并使用證書發(fā)布機構的私鑰對其進行簽名構成一個指紋,并將指紋與該證書放在一起。</p><p><b>  構建自簽名證書:</b></p><p>  申請數(shù)字證書之前,需要在密鑰庫中以別名的方式生成本地數(shù)字證書,建立相應的加密算法,密鑰,有效期等信息。</p><p>  keyto

32、ol -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 3600 -alias server -keystore server.keystore</p><p><b>  各參數(shù)含義如下:</b></p><p>  -genkeypair 表示生成密鑰對</p>

33、<p>  -keyalg 指定密鑰算法,這里是RSA</p><p>  -keysize 指定密鑰長度,默認1024,這里指定2048</p><p>  -sigal 指定簽名算法,這里是SHA1withRSA</p><p>  -validity 指定有效期,單位為天</p><p

34、>  -alias 指定別名</p><p>  -keystore 指定密鑰庫存儲位置</p><p>  這里我輸入?yún)?shù)123456作為密鑰庫的密碼,也可通過參數(shù)-storepass指定密碼。</p><p>  注意:一個keystore應該是可以存儲多套<私鑰-數(shù)字證書>的信息,通過別名來區(qū)分。</p>

35、<p>  通過實踐,調用上述命令兩次(別名不同),生成同一個keystore,用不同別名進行加密解密和簽名驗簽,沒有任何問題。</p><p>  經過上述操作后,密鑰庫中已經創(chuàng)建了數(shù)字證書。雖然這時的數(shù)字證書并沒有經過CA認證,但并不影響我們使用。我們仍可將證書導出,發(fā)送給合作伙伴進行加密交互。</p><p>  keytool -exportcert -alias ser

36、ver -keystore server.keystore -file server.cer -rfc</p><p><b>  各參數(shù)含義如下:</b></p><p>  -exportcert  表示證書導出操作</p><p>  -alias 指定別名</p><p>  -keystore

37、 指定密鑰庫文件</p><p>  -file 指定導出證書的文件路徑</p><p>  -rfc 指定以Base64編碼格式輸出</p><p><b>  打印證書</b></p><p>  keytool -printcert -file server.cer</p

38、><p><b>  2.4 開發(fā)環(huán)境</b></p><p>  運行系統(tǒng):Windows 10</p><p>  開發(fā)環(huán)境:eclipse,Navicat for MySQL</p><p>  基于eclipse編程軟件對CA系統(tǒng)的設計與實現(xiàn)</p><p>  MySQL安裝教程:</

39、p><p>  1、把 mysql-5.7.19-winx64.zip 壓縮文件解壓到D:\目錄下;</p><p>  2、在D:\mysql-5.7.19-winx64 目錄下新建 my.ini 配置文件;</p><p>  3、用文本編輯器或其他編輯器打開 my.ini 文件,把以下代碼復制粘貼進去,保存退出;</p><p><b

40、>  #代碼開始</b></p><p><b>  [Client]</b></p><p><b>  #設置3306端口</b></p><p>  port = 3306</p><p><b>  [mysqld]</b></p>&l

41、t;p><b>  #設置3306端口</b></p><p>  port = 3306</p><p>  # 設置mysql的安裝目錄</p><p>  basedir= D:\mysql-5.7.19-winx64 </p><p>  # 設置mysql數(shù)據(jù)庫的數(shù)據(jù)的存放目錄</p>&l

42、t;p>  datadir= D:\mysql-5.7.19-winx64\data</p><p><b>  # 允許最大連接數(shù)</b></p><p>  max_connections=200</p><p>  # 服務端使用的字符集默認為8比特編碼的latin1字符集</p><p>  charact

43、er-set-server=utf8</p><p>  # 創(chuàng)建新表時將使用的默認存儲引擎</p><p>  default-storage-engine=INNODB</p><p>  sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES </p><p><b>  [my

44、sql]</b></p><p>  # 設置mysql客戶端默認字符集</p><p>  default-character-set=utf8</p><p><b>  #代碼結束</b></p><p><b>  4、配置環(huán)境變量;</b></p><p&g

45、t;  4.1、新建系統(tǒng)變量 MYSQL_HOME ,并配置變量值為 D:\ ;</p><p>  4.2、編輯系統(tǒng)變量 Path ,將 ;%MYSQL_HOME%\bin 添加到 Path 變量值后面。</p><p>  5、以管理員身份運行命令提示符cmd(一定要用管理員身份運行,不然權限不夠);</p><p>  5.1、使用dos指令,進入D:\mys

46、ql-5.7.19-winx64 目錄,運行以下指令</p><p>  mysqld --defaults-file=my.ini --initialize-insecure</p><p>  mysqld --install</p><p>  net start mysql</p><p>  5.2、設置 mysql 的 root

47、密碼,運行以下指令</p><p>  mysql -u root -p</p><p>  use mysql;</p><p>  update user set authentication_string=password('您的密碼') where user='root';</p><p>  flus

48、h privileges;</p><p><b>  exit</b></p><p><b>  安裝到此完成。</b></p><p><b>  3. 詳細設計</b></p><p>  3.1 系統(tǒng)設計框架</p><p>  首先,用Jav

49、a的keytool生成Keystore和CA證書,實現(xiàn)自我的簽發(fā),然后開始監(jiān)聽用戶的信息傳送,當用戶通過驗證并把用戶信息和用戶的公鑰進行簽名,然后對用戶信息進行封裝,生成數(shù)字證書,并保留用戶信息,最后就是驗證數(shù)字簽名。如果用戶公鑰丟失需要掛失,用戶需要先驗證自己的身份,通過驗證才可以進行掛失;如果公鑰已經掛失,則掛失失敗。</p><p>  具體的結構設計如下圖:</p><p>  圖

50、3-1 CA系統(tǒng)模塊圖</p><p>  本次課程設計涉及到了主界面的設計,具體的系統(tǒng)包括內部的程序設計以及運行界面的設計,內部的程序主要是將界面輸入的數(shù)據(jù)接收,而且需要連接數(shù)據(jù)庫進行用戶信息的驗證,以及證書的吊銷;然后在后臺進行用戶信息的處理,包括數(shù)字簽名以及封裝數(shù)字證書,最后把掃描數(shù)字簽名的結果放主界面顯示,其內部程序運行的流程圖如下圖:</p><p>  圖3-2 CA系統(tǒng)流程圖

51、</p><p><b>  3.2 界面設計</b></p><p>  本程序的界面設計主要是顯示數(shù)字簽名以及保存的結果,以及將用戶信息存入到數(shù)據(jù)庫中。申請證書之前需要設置用戶信息,然后單擊申請按鈕,即可進行證書申請,最后在中央窗體的狀態(tài)顯示區(qū)中顯示數(shù)字簽名的結果,簽名完成后用戶可以繼續(xù)進行掛失申請或者直接退出界面。</p><p>  S

52、wing 提供了三個通用的頂層容器類JFrame,JDialog和JApplet。JFrame提供了基于窗體的應用程序,JDialog提供對話框形式的界面,JApplet提供Java小應用程序的界面形式。在頂層容器下是中間容器,用于容納其他的組件。通常窗格本身在顯示界面中是看不到的。面板類Panel是一種中間容器,它的唯一作用是使組件更容易定位。頂層容器通過getContentPane()方法獲取內部的一個內容窗格。</p>

53、<p>  (1)常用Swing組件:</p><p>  文本區(qū):JTextArea</p><p><b>  按鈕:button</b></p><p>  標簽組:JLabel</p><p>  文本字段:JTextField</p><p> ?。?)主機IP面板實現(xiàn)(其

54、他類似):</p><p>  jContentPane = new JPanel();</p><p>  jContentPane.setLayout(null);</p><p>  jContentPane.add(ipHostLabel, null);</p><p> ?。?)標簽 (JLabel)</p><

55、;p>  用來顯示文字,圖標(可以文字與圖標同時顯示)。</p><p>  JLabel構造方法</p><p>  JLabel() 創(chuàng)建一個空標簽</p><p>  JLabel(String c) 指定標簽文本</p><p>  起始端口標簽的設計如下(其他類似):&l

56、t;/p><p>  jbPortLabel = new JLabel();</p><p>  jbPortLabel.setBounds(new Rectangle(228, 10, 65, 28));</p><p>  jbPortLabel.setText("起始端口:");</p><p> ?。?)文本區(qū)域信息添

57、加函數(shù):</p><p>  public static void appendTextArea(String s) {</p><p>  jTextArea.append("\n" + s + "\n");</p><p><b>  }</b></p><p> ?。?)單

58、行文本框(JTextField)</p><p><b>  構造方法</b></p><p>  JTextField()</p><p>  JTextField(int columns) 指定寬度</p><p>  JTextField(String text) 指定初始化文本</p>

59、;<p>  JTextField(String text, int columns) </p><p>  編輯框函數(shù)設計如下(其他類似):</p><p>  private JTextField getJHostTextField() {</p><p>  if (jHostTextField == null) {</p><

60、;p>  jHostTextField = new JTextField("");</p><p>  jHostTextField.setBounds(new Rectangle(105, 10, 110, 26));</p><p><b>  }</b></p><p>  return jHostTextFie

61、ld;</p><p><b>  }</b></p><p><b> ?。?)按鈕的創(chuàng)建</b></p><p><b>  構造方法:</b></p><p><b>  JButton()</b></p><p>  JBu

62、tton(String c) 指定顯示文本</p><p>  JButton(Icon image) 指定顯示圖標</p><p>  JButton(String c ,Icon image)</p><p>  申請按鈕函數(shù)實現(xiàn)(保存按鈕類似):</p><p>  private JButton getCon

63、nJButton() {</p><p>  if (okJButton == null) {</p><p>  okJButton = new JButton();</p><p>  okJButton.setBounds(new Rectangle(300, 145, 97, 26));</p><p>  okJButton.set

64、Text("申請");</p><p>  okJButton.addActionListener(this);</p><p><b>  }</b></p><p>  return okJButton;</p><p><b>  }</b></p><

65、p>  (7)多行文本框(JTextArea)</p><p><b>  構造方法</b></p><p>  JTextArea()</p><p>  JTextArea(int rows,columns) 指定尺寸</p><p>  JTextArea(String text) 指

66、定初始化文本</p><p>  JTextArea(String text,int rows, int columns) </p><p><b>  常用設置方法</b></p><p>  public void setLineWrap(boolean wrap):換行狀態(tài)設置</p><p>  public

67、void setRows(int rows) :設置行數(shù)</p><p>  public void setColumns(int columns):設置列數(shù)</p><p>  說明:顏色、字體、內容的設置同上(setForeground、setFont、setText)</p><p>  文本顯示框代碼設計如下:</p><p>  p

68、rivate TextArea getJTextArea() {</p><p>  if (jTextArea == null) {</p><p>  jTextArea = new TextArea();</p><p>  jTextArea.setEditable(false);</p><p>  jTextArea.setBou

69、nds(new Rectangle(15, 180, 580, 205));</p><p><b>  }</b></p><p>  return jTextArea;</p><p><b>  }</b></p><p> ?。?)初始化界面函數(shù)實現(xiàn):</p><p>

70、;  private void initialize() throws IOException {</p><p>  this.setSize(720, 440);</p><p>  this.setContentPane(getJContentPane());</p><p>  this.setTitle("MyCertificate(V1.0)

71、By Gan");</p><p>  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p>  this.setVisible(true);</p><p><b>  }</b></p><p><b>  3.3 主要代碼<

72、;/b></p><p>  數(shù)據(jù)庫的連接(查找刪改略):</p><p><b>  static {</b></p><p>  driverClass = "com.mysql.jdbc.Driver";</p><p>  url = "jdbc:mysql://localho

73、st:3306/mydb";</p><p>  user = "root";</p><p>  password = "123456";</p><p><b>  try {</b></p><p>  //通過字節(jié)碼對象方式加載靜態(tài)代碼塊</p>&

74、lt;p>  //從而注冊驅動程序</p><p>  Class.forName(driverClass);</p><p>  } catch (ClassNotFoundException e) {</p><p>  System.out.println("無法創(chuàng)建實體");</p><p>  e.prin

75、tStackTrace();</p><p><b>  }}</b></p><p>  public static Connection getConnection() {</p><p><b>  try {</b></p><p>  return DriverManager.getCon

76、nection(url, user, password);</p><p>  } catch (SQLException e) {</p><p>  e.printStackTrace();}</p><p>  return null;}</p><p>  這里主要是對數(shù)據(jù)庫的連接函數(shù)的編寫以及函數(shù)的封裝,方便再一次使用時候直接調用,

77、而不用重新連接。</p><p>  將字符串轉換為公鑰的函數(shù):</p><p>  private PublicKey getPubKey(String pubkey) {</p><p>  PublicKey publicKey = null;</p><p><b>  try {</b></p>

78、<p>  java.security.spec.X509EncodedKeySpec APubKeySpec = new java.security.spec.X509EncodedKeySpec(</p><p>  new BASE64Decoder().decodeBuffer(pubkey));</p><p>  // RSA對稱加密算法</p><

79、;p>  java.security.KeyFactory keyFactory;</p><p>  keyFactory = java.security.KeyFactory.getInstance("RSA");</p><p><b>  // 取公鑰匙對象</b></p><p>  publicKey =

80、keyFactory.generatePublic(APubKeySpec);</p><p>  } catch (NoSuchAlgorithmException e) {</p><p>  e.printStackTrace();</p><p>  } catch (InvalidKeySpecException e) {</p><p

81、>  e.printStackTrace();</p><p>  } catch (IOException e) {</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>  return publicKey;</p><p>

82、;<b>  }</b></p><p>  由于接收用戶信息的時候,都是字符串,所以不能直接用于數(shù)字簽名,不然會簽名失敗,所以這里首先是將字符串轉換為公鑰,然后返回公鑰。</p><p><b>  用戶證書簽名函數(shù):</b></p><p>  public static boolean verifySign(X509

83、Certificate certificate,byte[] sign,byte[] original){ </p><p><b>  try{ </b></p><p>  //獲得簽名實例 </p><p>  Signature signature=Signature.getInstance(certificate.getSigA

84、lgName()); </p><p>  //用證書公鑰進行初始化 </p><p>  signature.initVerify(certificate.getPublicKey()); </p><p><b>  //更新源數(shù)據(jù) </b></p><p>  signature.update(origina

85、l); </p><p>  //驗證數(shù)字簽名 </p><p>  return signature.verify(sign); </p><p>  首先,先獲得簽名實例,用證書公鑰進行初始化驗,其次更新源數(shù)據(jù),然后驗證數(shù)字簽名,并返回數(shù)字簽名結果。這里需要注意的是,一定要先知道CA證書(CA頒發(fā)機構)數(shù)字簽名的算法,這是因為CA證書的簽名算法是eclip

86、se里面的keystore自己確定的、隨機的,和代碼本身編寫使用的算法不一定一樣,所以根據(jù)CA證書的算法采用相同的算法來確定驗證數(shù)字簽名的算法才能保證簽名驗證成功。</p><p><b>  用戶證書掛失函數(shù):</b></p><p>  public static void cancel(String id,String apub) {</p>&l

87、t;p>  My_dao dao= new My_dao();</p><p>  int userID=Integer.parseInt(id);</p><p>  boolean ss=dao.idExists(userID);</p><p>  boolean s1=dao.PubKey_Exist(apub);</p><

88、p>  if(s1==true) {</p><p>  JOptionPane.showMessageDialog(null, "該公鑰已被掛失!!","提示",JOptionPane.CANCEL_OPTION);</p><p><b>  return;</b></p><p><b&

89、gt;  }</b></p><p>  if(ss==false){</p><p>  JOptionPane.showMessageDialog(null, "掛失人不合法!!","提示",JOptionPane.CANCEL_OPTION);</p><p><b>  return;}</

90、b></p><p>  boolean s2=dao.inserCA(apub);</p><p>  if(s2==true) {</p><p>  JOptionPane.showMessageDialog(null, "掛失成功!!","提示",JOptionPane.CANCEL_OPTION);</p

91、><p><b>  }else {</b></p><p>  JOptionPane.showMessageDialog(null, "掛失error!!","提示",JOptionPane.CANCEL_OPTION);</p><p>  首先為了防止非法用戶的惡意掛失行為,需要認證掛失者的身份是否合

92、法,所以這里需要接收掛失者的id;通過認證之后,再判斷該公鑰是否已經被掛失,所以也需要傳入公鑰,最后把準備作廢的公鑰存入到掛失的公鑰數(shù)據(jù)庫中。</p><p><b>  吊銷公鑰函數(shù):</b></p><p>  public boolean inserCA(String apub) {</p><p>  String sql = &quo

93、t;insert into mypub(pubkey)values(?)";</p><p><b>  try {</b></p><p>  conn = JdbcUtil.getConnection();</p><p>  pstmt = conn.prepareStatement(sql);</p><p

94、>  pstmt.setString(1, apub);</p><p>  int i=pstmt.executeUpdate();</p><p><b>  if (i>0)</b></p><p>  return true;</p><p>  } catch (SQLException e)

95、 {</p><p>  e.printStackTrace();</p><p>  } finally {</p><p>  JdbcUtil.release(null, pstmt, conn);}</p><p>  return false;}</p><p>  用戶在申請掛失后,首先得建立數(shù)據(jù)庫連接連

96、通數(shù)據(jù)庫,將不受信任的公鑰存入到數(shù)據(jù)庫中,并返回數(shù)據(jù)庫數(shù)據(jù)插入的結果。</p><p>  3.4 測試和運行結果</p><p><b>  初始運行界面:</b></p><p>  圖3-1 CA系統(tǒng)初始界面</p><p><b>  用戶證書申請功能:</b></p><

97、;p>  圖3-2 CA用戶證書申請成功</p><p><b>  保存功能:</b></p><p><b>  保存之前:</b></p><p>  圖3-3 用戶信息保存之前</p><p><b>  保存之后:</b></p><p>

98、;  圖3-4 用戶信息保存成功</p><p><b>  公鑰吊銷:</b></p><p>  圖3-5 用戶公鑰吊銷成功</p><p>  吊銷公鑰存入數(shù)據(jù)庫:</p><p><b>  保存之前:</b></p><p>  圖3-6 吊銷公鑰保存之前</

99、p><p><b>  保存之后:</b></p><p>  圖3-7 吊銷公鑰保存成功</p><p><b>  生成證書:</b></p><p>  圖3-8 吊銷公鑰保存成功</p><p>  4. 所遇到的問題及分析解決</p><p> 

100、 問題一:在驗證數(shù)字證書簽名時,簽名失敗后,會代碼報錯?</p><p>  解決辦法:缺少一個數(shù)字簽名結果返回值test,而且,這個簽名結果驗證應該放在保存用戶信息之前,并設置接受參數(shù),然后return即可。</p><p>  問題二:無法實現(xiàn)從外面以字符串的方式傳遞用戶信息到生成用戶證書的函數(shù)中?</p><p>  解決辦法:將用戶信息用數(shù)組接收,代碼如下:

101、 </p><p><b>  //設置用戶信息</b></p><p>  String CN = Personinfo[0];</p><p>  String OU =Personinfo[1];</p><p>  String O =Personinfo[2];</p>

102、;<p>  String L =Personinfo[3];</p><p>  String ST =Personinfo[4];</p><p>  String C =Personinfo[5];</p><p>  這樣就可以實現(xiàn)可變的接收用戶數(shù)據(jù),生成對應的數(shù)字證書。</p><p>  問題三:服務器無法接收到客戶

103、端發(fā)送的數(shù)據(jù)?</p><p>  解決辦法:原先設計的時候,Socket數(shù)據(jù)包是可以接收的,但是突然第二天來運行就出錯了,原先以為是代碼的編寫錯誤,但是使用之前的代碼也沒有接收成功,經過幾天的卡殼,懷疑是eclipse版本的問題,但是安裝最新版本后并沒解決,于是去請教同班同學,問題的解決辦法,經過幾個鐘頭的調試也是沒有解決,最后沒辦法了,只能減少數(shù)據(jù)的接收了,好可惜,白忙活了幾天。只能先完成主要的功能了。<

104、;/p><p>  問題四:用戶證書的數(shù)字簽名總是驗證失???</p><p>  解決辦法:首先,瀏覽編寫的代碼,看一下是否是代碼的錯誤,但是經過幾天的檢查以及調試,發(fā)現(xiàn)代碼并沒有錯誤,所以我懷疑是函數(shù)的問題,于是便換了一個簽名函數(shù)以及用戶信息的接收函數(shù),但是問題并沒有解決;沒辦法,懷疑是eclipse的JDK問題,于是便下載了最新版的JDK,安裝之后運行,但是簽名還是失敗了,這次真的是沒有辦

105、法了,于是便找同學幫忙,但是同學也沒有找到解決的辦法;于是,決定重新查閱書本,看到CA證書的簽名算法時,突然想起可能是簽名算法出問題了,我便查看了一下CA頒發(fā)證書的簽名算法,才恍然大悟,原來CA證書的簽名算法是sha256,而驗證簽名的算法是sha1,欣喜之余,問題終于解決了,也了解到,數(shù)字簽名和簽名驗證的算法必須要一樣,不然簽名將永遠無法驗證成功。</p><p>  問題五:MySQL報錯?</p>

106、;<p>  FATAL ERROR: Could not find /home/mysql/bin/my_print_defaults If you are using a binary release,you must run this script from within the directory the archive extracted into. If you compiled MySQL yourself

107、you must run ‘make install’ first.</p><p>  解決辦法:經過瀏覽網(wǎng)頁,可以知道這個錯誤是因為沒有指明mysql的data路徑導致的:</p><p>  vim /etc/my.cnf</p><p>  在[mysqld] 后面加上如下路徑:</p><p>  basedir = /usr/lo

108、cal/mysql</p><p>  datadir =/opt/data;</p><p>  這樣問題就可以解決了。</p><p>  5. 系統(tǒng)特色及關鍵技術</p><p><b>  系統(tǒng)特色:</b></p><p>  吊銷公鑰的函數(shù)(位于My_DAO.java 73行)<

109、;/p><p>  //用于將將不受信任的公鑰存入數(shù)據(jù)庫中</p><p>  public boolean inserCA(String apub) {</p><p>  String sql = "insert into mypub(pubkey)values(?)";</p><p><b>  try {&

110、lt;/b></p><p>  conn = JdbcUtil.getConnection();</p><p>  pstmt = conn.prepareStatement(sql);</p><p>  pstmt.setString(1, apub);</p><p>  int i=pstmt.executeUpdat

111、e();</p><p><b>  if (i>0)</b></p><p>  return true;</p><p>  } catch (SQLException e) {</p><p>  e.printStackTrace();</p><p>  } finally {&l

112、t;/p><p>  JdbcUtil.release(null, pstmt, conn);</p><p><b>  }</b></p><p>  return false;</p><p><b>  }}</b></p><p>  在這里不同于其他人的是,我的公鑰掛

113、失,是通過將掛失的公鑰存入到不受信任的數(shù)據(jù)庫里面,然后再次用到該公鑰時候會彈出錯誤提示,即達到了公鑰掛失的效果。</p><p>  接收用戶數(shù)據(jù)(位于MainUI.java 中的237行)</p><p>  個人信息的接收以及信息在函數(shù)之間調用的時候是通過一個數(shù)組來實現(xiàn)的,通過整個數(shù)組引用,這樣避免重復繁瑣,代碼實現(xiàn)如下:</p><p>  String[]

114、Perinfo ={"","","","","","",""};</p><p>  Perinfo[0]=jUserTextField.getText();</p><p>  Perinfo[1]=jOrgUnTextField.getText(

115、);</p><p>  Perinfo[2]=jOrgNTextField.getText();</p><p>  Perinfo[3]=jCityTextField.getText();</p><p>  Perinfo[4]=jStateTextField.getText();</p><p>  Perinfo[5]=jCount

116、ryTextField.getText();</p><p>  Perinfo[6]=jVerifyTextField.getText();</p><p>  String Apub=jApubTextField.getText();</p><p><b>  關鍵技術:</b></p><p>  CA公鑰對用戶

117、進行簽名:(位于MyCertificate.java 中的146行)</p><p>  // 用新證書信息封成為新X.509證書</p><p>  newcert = new X509CertImpl(ClientInfo);</p><p>  byte[] original=ClientInfo.getEncodedInfo();</p>&l

118、t;p>  // 生成新正書驗證碼</p><p>  newcert.sign(CAPrivateKey, "sha256WithRSA");</p><p>  byte[] sig=newcert.getSignature(); </p><p>  驗證簽名 (位于MyCertificate.java 中的247行)</p&g

119、t;<p>  Signature signature=Signature.getInstance(certificate.getSigAlgName()); </p><p>  //用證書公鑰進行初始化 </p><p>  signature.initVerify(certificate.getPublicKey()); </p><p>&

120、lt;b>  //更新源數(shù)據(jù) </b></p><p>  signature.update(original); </p><p>  //驗證數(shù)字簽名 </p><p>  return signature.verify(sign); </p><p>  }catch(Exception e){ </p&

121、gt;<p>  return false; </p><p>  這里通過加載CA證書獲取簽名的算法以及CA證書公鑰,然后將傳入進來的已簽名數(shù)據(jù)進行驗證,然后返回驗證結果。</p><p><b>  6. 結論及體會</b></p><p>  本次課程設計,遇到的困難不少,有些問題解決了,有些還是很迷糊,有些問題甚至讓我換

122、了幾次題目,安裝了幾次軟件,就比如,其中遇到的數(shù)據(jù)包無法從客戶端發(fā)送到服務器,經過幾次代碼的調試還是不行,安裝了最新版本eclipse軟件后還是沒能解決,反復糾結了幾天。最后,沒辦法,為了不但耽誤代碼的編寫,以及任務的順利的完成,只能先把問題放一邊。另外,在剛開始進行代碼編寫時發(fā)現(xiàn)自己好多的知識不懂、不熟悉,顯得很遲鈍,不寫不知道,一寫嚇一跳,很多的內容之前掌握得還是可以的,但是由于很久沒寫代碼,知識也忘得差不多了,導致花費很多時間回去

123、梳理舊知識,這就說明了知識應該經常回去梳理,不然很容易生疏甚至忘記。</p><p>  從確定題目開始,我就先開始查閱相關書籍,瀏覽網(wǎng)頁,把編程過程需要的材料收集好。其次,設計好總體的程序流程圖。最后,按部就班,把理論歸于實踐,進行具體的Java編程了。由于上學期學習Java編程不夠深入,程序寫的相對簡單,并不是因為設計要求復雜到難以理解,而是本人的能力尚在基礎階段,正陷于梳理知識當中,只能進行簡單的Java編

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論