版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 信息安全課程設(shè)計(jì)說(shuō)明書(shū)</p><p> 題 目: CA系統(tǒng) </p><p> 學(xué) 院: 計(jì)算機(jī)與信息安全學(xué)院 </p><p> 專 業(yè): 姓 名:
2、 </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 年 月 日 </p><p><b> 摘 要</b></p><p&
3、gt; CA系統(tǒng)是基于數(shù)字證書(shū)的一種認(rèn)證機(jī)制,是用于互聯(lián)網(wǎng)通訊中標(biāo)志互相身份的一種已簽名數(shù)字,數(shù)字證書(shū)提供了一種驗(yàn)證通信雙方的途徑,它的功能相當(dāng)于我們?nèi)粘5纳矸葑C,還有營(yíng)業(yè)執(zhí)照之類的。它是基于PKI公鑰基礎(chǔ)設(shè)施的一種認(rèn)證技術(shù),是由一個(gè)權(quán)威機(jī)構(gòu)CA(Certificate Authority)中心發(fā)布的,又被稱為證書(shū)授權(quán)機(jī)構(gòu)。數(shù)字證書(shū)包含公開(kāi)密鑰擁有者信息以及公開(kāi)密鑰的文件。最簡(jiǎn)單的證書(shū)包含一個(gè)公開(kāi)密鑰、用戶信息及證書(shū)授權(quán)中心的信息以及
4、數(shù)字簽名,數(shù)字證書(shū)還有一個(gè)重要的特征就是只在有效期的時(shí)間段內(nèi)有效。在日常生活中,人們可以通過(guò)互相交換證書(shū)借助CA認(rèn)證機(jī)構(gòu)來(lái)進(jìn)行身份識(shí)別,特別是在在線購(gòu)物,如淘寶、京東等,數(shù)字證書(shū)對(duì)于交易的安全進(jìn)行起到極其重要的作用。</p><p> 本次課程設(shè)計(jì)中,首先是利用keysotre生成密鑰庫(kù)以及頒發(fā)者自己的證書(shū),這個(gè)就充當(dāng)CA頒發(fā)機(jī)構(gòu),然后判斷申請(qǐng)用戶是否合法,認(rèn)證通過(guò)后,根據(jù)提交的公鑰,以及個(gè)人信息給用戶頒發(fā)數(shù)字
5、證書(shū)。</p><p> 【關(guān)鍵字】 CA 用戶證書(shū) 數(shù)字簽名</p><p><b> 前言</b></p><p> 隨著科技的不斷進(jìn)步,人們生活水平的不斷提高,電子商務(wù)越來(lái)越受到當(dāng)今人們的青睞,如網(wǎng)上簽約、網(wǎng)上購(gòu)物、網(wǎng)上繳費(fèi)等。這是因?yàn)槿藗儾恍枰獮榇蠊P的現(xiàn)金交易和而頭疼,取而代之的是在線支付,如支付寶、快捷支付,交易的不
6、再是簡(jiǎn)單的現(xiàn)金,而是電子現(xiàn)金,更不用大老遠(yuǎn)的去實(shí)體店購(gòu)物和參加會(huì)議協(xié)商。但也無(wú)可避免的帶來(lái)的隱患,也就是交易過(guò)程中的安全問(wèn)題,如何保證信息的保密性,如何確定交易者就是本人,如何保證交易達(dá)成后雙方不能否認(rèn),又如何保證交易信息(如日期)沒(méi)有被篡改?于是數(shù)字證書(shū)應(yīng)運(yùn)而生,數(shù)字安全證書(shū)提供了一種在網(wǎng)上驗(yàn)證身份的方式。安全證書(shū)體制主要采用了公開(kāi)密鑰體制,其它還包括對(duì)稱密鑰加密、數(shù)字簽名、數(shù)字信封等技術(shù)。數(shù)字證書(shū)的加密機(jī)制保證了信息的保密性,數(shù)字簽
7、名等技術(shù)保證了數(shù)據(jù)的不可修改性,認(rèn)證機(jī)制保證了交易的不可否認(rèn)性。</p><p> 雖然之前在密碼學(xué)課程學(xué)習(xí)中有接觸過(guò)有關(guān)數(shù)字證書(shū)的知識(shí),但是大部分內(nèi)容已變得生疏,所以在準(zhǔn)備階段,我就先去學(xué)校的圖書(shū)館瀏覽一些相關(guān)電子資源,以及借閱了張明德和劉偉寫(xiě)的《PKI/CA/數(shù)字證書(shū)技術(shù)大全》,打算使用Java語(yǔ)言編寫(xiě),順便借閱了葉乃文寫(xiě)的《Java語(yǔ)言程序設(shè)計(jì)教程》,從以往的碩士論文中可以知道,關(guān)于CA系統(tǒng)的設(shè)計(jì)見(jiàn)仁見(jiàn)智
8、,不過(guò)總體上已實(shí)現(xiàn)了大體上的自己充當(dāng)頒發(fā)機(jī)構(gòu)進(jìn)而進(jìn)行數(shù)字證書(shū)的頒發(fā)。本次課程設(shè)計(jì),在已實(shí)現(xiàn)的技術(shù)基礎(chǔ)上進(jìn)行功能、數(shù)據(jù)傳輸上的完善,在Java的keytool中生成頒發(fā)機(jī)構(gòu)的keystone以及頒發(fā)者的數(shù)字證書(shū),然后將頒發(fā)者的信息加載,用自己的私鑰對(duì)提交的用戶信息以及公鑰進(jìn)行簽名,生成數(shù)字證書(shū)并頒發(fā)給用戶。在用戶信息的提交的過(guò)程中,會(huì)先對(duì)用戶身份進(jìn)行身份認(rèn)證,在驗(yàn)證用戶身份合法之后,才對(duì)用戶進(jìn)行簽名,然后再保存用戶的信息到數(shù)據(jù)庫(kù)中。<
9、;/p><p> 另外,在CA系統(tǒng)的設(shè)計(jì)過(guò)程中,考慮到用戶因可能因丟失公鑰而造成損失,所以基于這個(gè)隱患而添加了一個(gè)用戶證書(shū)掛失的功能,這樣就能在很大的程度上減少用戶的損失。在掛失之前會(huì)首先核對(duì)掛失者的身份是否合法,防止別人惡意的掛失行為,而且,已經(jīng)掛失的會(huì)彈出錯(cuò)誤提示,避免重復(fù)掛失。在掛失之后會(huì)把公鑰存入到不受信任的公鑰數(shù)據(jù)庫(kù)中,當(dāng)用戶再次使用該公鑰時(shí)會(huì)也會(huì)彈出錯(cuò)誤提示。而且,本次CA系統(tǒng)設(shè)計(jì)中一個(gè)人是可以使用多個(gè)
10、驗(yàn)證信息申請(qǐng)多個(gè)用戶證書(shū)的,這樣就提高了數(shù)字證書(shū)用途的廣泛性,而不必受限于數(shù)字證書(shū)在不同領(lǐng)域上的使用。</p><p><b> 2. 系統(tǒng)分析</b></p><p><b> 2.1 系統(tǒng)需求</b></p><p> 首先,我們先來(lái)看一下靜態(tài)口令身份認(rèn)證方式的的安全隱患:</p><p>
11、;<b> 口令容易遺失</b></p><p> 用戶名、口令在應(yīng)用系統(tǒng)中以明文方式傳輸,容易被截取,造成口令遺失,還有輸入口令時(shí)被窺視造成口令遺失;用戶名、口令存在數(shù)據(jù)庫(kù)中,非法用戶可以通過(guò)進(jìn)入數(shù)據(jù)庫(kù)獲取口令信息。</p><p><b> 遺失不容易察覺(jué)</b></p><p> 用戶口令遺失后,自己并不知道
12、,不會(huì)采取措施防范遺失后可能造成的損失。</p><p> 大量口令需要記憶(不易保管)</p><p> 如果存在多個(gè)應(yīng)用系統(tǒng),可能存在多組用戶名、口令,不方便記憶。</p><p> 然而,在使用數(shù)字證書(shū)代替?zhèn)鹘y(tǒng)靜態(tài)口令身份方式具有以下優(yōu)勢(shì):</p><p><b> 權(quán)威性:</b></p>
13、<p> 數(shù)字證書(shū)設(shè)備由CA中心頒發(fā),使用其作為身份識(shí)別設(shè)備局域哦很高的權(quán)威性;</p><p><b> 不可偽造型:</b></p><p> 數(shù)字證書(shū)設(shè)備經(jīng)過(guò)國(guó)家相關(guān)部門(mén)審核批準(zhǔn),設(shè)備中保存的用戶私鑰無(wú)法被讀出,不可偽造;</p><p><b> 不容易被冒用:</b></p>&l
14、t;p> 使用證書(shū)需要同時(shí)持有數(shù)字證書(shū)設(shè)備和設(shè)備啟動(dòng)口令,缺一不可,因此只要保護(hù)好證書(shū)設(shè)備,他人無(wú)法冒用用戶身份;</p><p><b> 不可破解:</b></p><p> 數(shù)字證書(shū)設(shè)備具有口令保護(hù)機(jī)制,在連續(xù)輸入錯(cuò)誤一定次數(shù)后,設(shè)備將鎖定,防止暴力破解;</p><p><b> 容易保管:</b>
15、</p><p> 數(shù)字證書(shū)設(shè)備形狀與普通U盤(pán)相似,方便攜帶保管,不易遺失;</p><p><b> 遺失容易發(fā)現(xiàn):</b></p><p> 萬(wàn)一數(shù)字證書(shū)設(shè)備遺失,能夠及時(shí)發(fā)現(xiàn),并采取相應(yīng)措施。</p><p> 根據(jù)以上分析,選擇使用數(shù)字證書(shū)的身份模式,能夠極大的提高用戶身份的安全性,保障應(yīng)用系統(tǒng)用戶身份安
16、全。和傳統(tǒng)”用戶名+口令”應(yīng)用模式,CA具有高強(qiáng)度的通訊方式,能夠?qū)崿F(xiàn)傳輸數(shù)據(jù)的安全保障,是通過(guò)數(shù)字簽名技術(shù)實(shí)現(xiàn),通過(guò)簽名驗(yàn)證確定數(shù)據(jù)傳輸和存儲(chǔ)的完整性,因?yàn)橹挥惺跈?quán)用戶才能進(jìn)行解密并使用,所以保證了數(shù)據(jù)的機(jī)密性;另外,這是通過(guò)數(shù)字簽名技術(shù)實(shí)現(xiàn)的,因此用戶不得否認(rèn)簽名操作,即不可否認(rèn)性。</p><p> 本次課程設(shè)計(jì)是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的CA頒發(fā)系統(tǒng),基本要求如下:</p><p> 利用
17、Java中的keytool生成的Keystore和CA證書(shū)來(lái)充當(dāng)可信任的CA頒發(fā)機(jī)構(gòu),CA頒發(fā)機(jī)構(gòu)本身是存儲(chǔ)有一定的用戶的認(rèn)證信息的,然后接受用戶的認(rèn)證請(qǐng)求,通過(guò)用戶的認(rèn)證信息可以判斷申請(qǐng)用戶是否合法或者用戶的公鑰是否已申請(qǐng)注冊(cè)過(guò);</p><p> 認(rèn)證通過(guò)后開(kāi)始接收用戶信息和用戶自己產(chǎn)生的PublicKey</p><p> 接收完成后,先通過(guò)加載CA數(shù)字證書(shū)獲得CA頒發(fā)機(jī)構(gòu)的信息
18、以及CA的私鑰,然后對(duì)接收到的用戶信息和公鑰進(jìn)行打包即數(shù)字簽名,生成數(shù)字證書(shū)并頒發(fā)給用戶,安全儲(chǔ)存用戶信息;</p><p> 數(shù)字證書(shū)吊銷:這里是通過(guò)將用戶需要掛失的公鑰存入到不受信任的公鑰數(shù)據(jù)庫(kù)中,這樣,該密鑰將被作廢;在掛失前會(huì)對(duì)掛失用戶進(jìn)行身份驗(yàn)證,防止惡意掛失行為,驗(yàn)證通過(guò)后還要訪問(wèn)一下不受信任的公鑰數(shù)據(jù)庫(kù)中是否已存在該公鑰,若已存在則彈出錯(cuò)誤提示;若不存在,則進(jìn)行公鑰掛失過(guò)程。掛失之后,當(dāng)用戶再次使
19、用到該公鑰認(rèn)證時(shí)會(huì)彈出錯(cuò)誤提示。</p><p><b> 2.2 數(shù)據(jù)庫(kù)連接</b></p><p> Navicat for MySQL 是一套專為 MySQL 設(shè)計(jì)的高性能數(shù)據(jù)庫(kù)管理及開(kāi)發(fā)工具。它可以用于任何版本 3.21 或以上的 MySQL 數(shù)據(jù)庫(kù)服務(wù)器,并支持大部份 MySQL 最新版本的功能,包括觸發(fā)器、存儲(chǔ)過(guò)程、函數(shù)、事件、視圖、管理用戶等。<
20、;/p><p> 點(diǎn)擊或選擇文件 -> 新建連接來(lái)設(shè)置連接屬性。</p><p><b> 連接設(shè)置:</b></p><p> 在創(chuàng)建連接后,你可以連接到數(shù)據(jù)庫(kù),管理它的對(duì)象、表中的數(shù)據(jù)等。請(qǐng)看下面的幫助,以了解如何用最簡(jiǎn)單的方法運(yùn)行這些操作。</p><p> 與數(shù)據(jù)庫(kù)或模式工作:</p>&
21、lt;p> 與數(shù)據(jù)庫(kù)或模式的對(duì)象工作Navicat 瀏覽器!</p><p> Navicat 窗口包括一個(gè)導(dǎo)覽窗格(左邊的窗格)及一個(gè)對(duì)象窗格(右邊的窗格)。</p><p> 導(dǎo)覽窗格一個(gè)是導(dǎo)覽連接、數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)對(duì)象的基本途徑。它采用樹(shù)狀結(jié)構(gòu),讓你透過(guò)彈出菜單快捷及方便地使用數(shù)據(jù)庫(kù)和它們的對(duì)象。</p><p> 對(duì)象窗格顯示開(kāi)啟表、查詢等。在窗
22、口頂部的工具欄提供其他控制項(xiàng),你可以用它來(lái)操作你的數(shù)據(jù)。</p><p> navicat如何連接mysql:</p><p> 1、首先你電腦上必須安裝了mysql的數(shù)據(jù)庫(kù)。(如果你不清楚自己是否已經(jīng)安裝成功mysql,你可以在開(kāi)始菜單輸入“mysql”,進(jìn)行搜索)</p><p> 2、打開(kāi)你的Navicat for Mysql(這里也可以使用上面的方法,
23、在開(kāi)始菜單搜索框中輸入‘navicat’)</p><p> 3、打開(kāi)后單機(jī)工具欄左邊第一個(gè)‘connection’,進(jìn)入連接頁(yè)面。</p><p> 4、最重要的一步:打開(kāi)的界面有五個(gè)框需要輸入,第一個(gè):connection Name 需要輸入的是你新建的連接的的名字,這里我們就命名為‘localhost’,第二個(gè):</p><p> HostName/Ip
24、 Address 你需要輸入的是你本機(jī)的ip地址或者直接輸入”localhost”,這里我們選擇第二種。 第三個(gè):Port ,輸入你安裝時(shí)候的端口號(hào),一般為默認(rèn)的3306;第四個(gè)和第五個(gè)分別為:UserName和Password,意思為你需要輸入你數(shù)據(jù)庫(kù)名用戶名和密碼,我的用戶名是:root,密碼:123456。最后把下面那個(gè)‘Save Passwod’的小框框給勾上。</p><p> 5、完成上面步驟,然后
25、點(diǎn)擊左下角有個(gè)‘testConnectiion’如果彈出success,恭喜你直接點(diǎn)擊右下角的‘save’按鈕就可以了。如果彈出error ,你則需要再重新仔細(xì)查看自己哪里填錯(cuò)了。</p><p> 6、點(diǎn)擊‘save’后,你就可以雙擊“本地”(這里的‘本地’是你剛才輸入的connection Name),然后打開(kāi)你的數(shù)據(jù)庫(kù)了。</p><p><b> 2.3 功能需求&l
26、t;/b></p><p><b> 用戶證書(shū)信息設(shè)計(jì):</b></p><p> 數(shù)字證書(shū)的主要思想是實(shí)現(xiàn)對(duì)于合法用戶信息的數(shù)字簽名并生成數(shù)字證書(shū),然后頒發(fā)給合法用戶,所以對(duì)于數(shù)字證書(shū)生成之前需要設(shè)計(jì)如下信息:</p><p> 版本(Version)</p><p> 版本信息,這個(gè)是證書(shū)的版本號(hào),不同
27、版本的證書(shū)格式是不同的(版本1、版本2、版本3)。這里我用的是V3版本。</p><p> 序列號(hào)(Serial Number)</p><p> 證書(shū)序列號(hào),同一身份驗(yàn)證機(jī)構(gòu)簽發(fā)的證書(shū)序列號(hào)是唯一的,這就是數(shù)字證書(shū)的不可</p><p><b> 否認(rèn)性。</b></p><p> 頒發(fā)者(Issuer)<
28、;/p><p> 頒發(fā)者,也就是CA頒發(fā)機(jī)構(gòu),指出這個(gè)證書(shū)是由誰(shuí)頒發(fā)的;如果是自己所在機(jī)構(gòu)生成的,比如自己所在的公司,那么頒發(fā)者就是自己的公司。</p><p> 簽名算法(Signature Algorithm)</p><p> 簽名算法,指的是對(duì)數(shù)字證書(shū)進(jìn)行簽名的時(shí)候所使用的算法,可以根據(jù)頒發(fā)者的公鑰進(jìn)行解密。</p><p> 使
29、用者(Subject)</p><p> 使用者就是證書(shū)的持有者,可以是個(gè)人、公司、企業(yè)、網(wǎng)站等等需要認(rèn)證自己身份的個(gè)體或者集體。</p><p> 有效期(Valid form begin_date to end_date)</p><p> 證書(shū)的有效期就是證書(shū)所允許使用的期限,當(dāng)數(shù)字證書(shū)過(guò)了有效期將無(wú)效,即對(duì)于用戶身份的認(rèn)證將無(wú)效,這就需要重新申請(qǐng)數(shù)字證
30、書(shū)方能進(jìn)行通信或者交易。</p><p> 公鑰(Public Key)</p><p> 證書(shū)的公鑰,主要是用來(lái)對(duì)消息進(jìn)行加密的,這個(gè)證書(shū)的公鑰是 2048 位的,他的值可以在對(duì)話框中看到,是很長(zhǎng)的一段十六進(jìn)制數(shù)。</p><p><b> 指紋和指紋算法</b></p><p> 指紋以及指紋算法,在證書(shū)發(fā)布
31、的時(shí)候,發(fā)布機(jī)構(gòu)會(huì)根據(jù)指紋算法先計(jì)算出整個(gè)證書(shū)的hash值,并使用證書(shū)發(fā)布機(jī)構(gòu)的私鑰對(duì)其進(jìn)行簽名構(gòu)成一個(gè)指紋,并將指紋與該證書(shū)放在一起。</p><p><b> 構(gòu)建自簽名證書(shū):</b></p><p> 申請(qǐng)數(shù)字證書(shū)之前,需要在密鑰庫(kù)中以別名的方式生成本地?cái)?shù)字證書(shū),建立相應(yīng)的加密算法,密鑰,有效期等信息。</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 表示生成密鑰對(duì)</p>
33、<p> -keyalg 指定密鑰算法,這里是RSA</p><p> -keysize 指定密鑰長(zhǎng)度,默認(rèn)1024,這里指定2048</p><p> -sigal 指定簽名算法,這里是SHA1withRSA</p><p> -validity 指定有效期,單位為天</p><p
34、> -alias 指定別名</p><p> -keystore 指定密鑰庫(kù)存儲(chǔ)位置</p><p> 這里我輸入?yún)?shù)123456作為密鑰庫(kù)的密碼,也可通過(guò)參數(shù)-storepass指定密碼。</p><p> 注意:一個(gè)keystore應(yīng)該是可以存儲(chǔ)多套<私鑰-數(shù)字證書(shū)>的信息,通過(guò)別名來(lái)區(qū)分。</p>
35、<p> 通過(guò)實(shí)踐,調(diào)用上述命令兩次(別名不同),生成同一個(gè)keystore,用不同別名進(jìn)行加密解密和簽名驗(yàn)簽,沒(méi)有任何問(wèn)題。</p><p> 經(jīng)過(guò)上述操作后,密鑰庫(kù)中已經(jīng)創(chuàng)建了數(shù)字證書(shū)。雖然這時(shí)的數(shù)字證書(shū)并沒(méi)有經(jīng)過(guò)CA認(rèn)證,但并不影響我們使用。我們?nèi)钥蓪⒆C書(shū)導(dǎo)出,發(fā)送給合作伙伴進(jìn)行加密交互。</p><p> keytool -exportcert -alias ser
36、ver -keystore server.keystore -file server.cer -rfc</p><p><b> 各參數(shù)含義如下:</b></p><p> -exportcert 表示證書(shū)導(dǎo)出操作</p><p> -alias 指定別名</p><p> -keystore
37、 指定密鑰庫(kù)文件</p><p> -file 指定導(dǎo)出證書(shū)的文件路徑</p><p> -rfc 指定以Base64編碼格式輸出</p><p><b> 打印證書(shū)</b></p><p> keytool -printcert -file server.cer</p
38、><p><b> 2.4 開(kāi)發(fā)環(huán)境</b></p><p> 運(yùn)行系統(tǒng):Windows 10</p><p> 開(kāi)發(fā)環(huán)境:eclipse,Navicat for MySQL</p><p> 基于eclipse編程軟件對(duì)CA系統(tǒng)的設(shè)計(jì)與實(shí)現(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、用文本編輯器或其他編輯器打開(kāi) my.ini 文件,把以下代碼復(fù)制粘貼進(jìn)去,保存退出;</p><p><b
40、> #代碼開(kāi)始</b></p><p><b> [Client]</b></p><p><b> #設(shè)置3306端口</b></p><p> port = 3306</p><p><b> [mysqld]</b></p>&l
41、t;p><b> #設(shè)置3306端口</b></p><p> port = 3306</p><p> # 設(shè)置mysql的安裝目錄</p><p> basedir= D:\mysql-5.7.19-winx64 </p><p> # 設(shè)置mysql數(shù)據(jù)庫(kù)的數(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> # 服務(wù)端使用的字符集默認(rèn)為8比特編碼的latin1字符集</p><p> charact
43、er-set-server=utf8</p><p> # 創(chuàng)建新表時(shí)將使用的默認(rèn)存儲(chǔ)引擎</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> # 設(shè)置mysql客戶端默認(rèn)字符集</p><p> default-character-set=utf8</p><p><b> #代碼結(jié)束</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、以管理員身份運(yùn)行命令提示符cmd(一定要用管理員身份運(yùn)行,不然權(quán)限不夠);</p><p> 5.1、使用dos指令,進(jìn)入D:\mys
46、ql-5.7.19-winx64 目錄,運(yùn)行以下指令</p><p> mysqld --defaults-file=my.ini --initialize-insecure</p><p> mysqld --install</p><p> net start mysql</p><p> 5.2、設(shè)置 mysql 的 root
47、密碼,運(yùn)行以下指令</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. 詳細(xì)設(shè)計(jì)</b></p><p> 3.1 系統(tǒng)設(shè)計(jì)框架</p><p> 首先,用Jav
49、a的keytool生成Keystore和CA證書(shū),實(shí)現(xiàn)自我的簽發(fā),然后開(kāi)始監(jiān)聽(tīng)用戶的信息傳送,當(dāng)用戶通過(guò)驗(yàn)證并把用戶信息和用戶的公鑰進(jìn)行簽名,然后對(duì)用戶信息進(jìn)行封裝,生成數(shù)字證書(shū),并保留用戶信息,最后就是驗(yàn)證數(shù)字簽名。如果用戶公鑰丟失需要掛失,用戶需要先驗(yàn)證自己的身份,通過(guò)驗(yàn)證才可以進(jìn)行掛失;如果公鑰已經(jīng)掛失,則掛失失敗。</p><p> 具體的結(jié)構(gòu)設(shè)計(jì)如下圖:</p><p> 圖
50、3-1 CA系統(tǒng)模塊圖</p><p> 本次課程設(shè)計(jì)涉及到了主界面的設(shè)計(jì),具體的系統(tǒng)包括內(nèi)部的程序設(shè)計(jì)以及運(yùn)行界面的設(shè)計(jì),內(nèi)部的程序主要是將界面輸入的數(shù)據(jù)接收,而且需要連接數(shù)據(jù)庫(kù)進(jìn)行用戶信息的驗(yàn)證,以及證書(shū)的吊銷;然后在后臺(tái)進(jìn)行用戶信息的處理,包括數(shù)字簽名以及封裝數(shù)字證書(shū),最后把掃描數(shù)字簽名的結(jié)果放主界面顯示,其內(nèi)部程序運(yùn)行的流程圖如下圖:</p><p> 圖3-2 CA系統(tǒng)流程圖
51、</p><p><b> 3.2 界面設(shè)計(jì)</b></p><p> 本程序的界面設(shè)計(jì)主要是顯示數(shù)字簽名以及保存的結(jié)果,以及將用戶信息存入到數(shù)據(jù)庫(kù)中。申請(qǐng)證書(shū)之前需要設(shè)置用戶信息,然后單擊申請(qǐng)按鈕,即可進(jìn)行證書(shū)申請(qǐng),最后在中央窗體的狀態(tài)顯示區(qū)中顯示數(shù)字簽名的結(jié)果,簽名完成后用戶可以繼續(xù)進(jìn)行掛失申請(qǐng)或者直接退出界面。</p><p> S
52、wing 提供了三個(gè)通用的頂層容器類JFrame,JDialog和JApplet。JFrame提供了基于窗體的應(yīng)用程序,JDialog提供對(duì)話框形式的界面,JApplet提供Java小應(yīng)用程序的界面形式。在頂層容器下是中間容器,用于容納其他的組件。通常窗格本身在顯示界面中是看不到的。面板類Panel是一種中間容器,它的唯一作用是使組件更容易定位。頂層容器通過(guò)getContentPane()方法獲取內(nèi)部的一個(gè)內(nèi)容窗格。</p>
53、<p> ?。?)常用Swing組件:</p><p> 文本區(qū):JTextArea</p><p><b> 按鈕:button</b></p><p> 標(biāo)簽組:JLabel</p><p> 文本字段:JTextField</p><p> ?。?)主機(jī)IP面板實(shí)現(xiàn)(其
54、他類似):</p><p> jContentPane = new JPanel();</p><p> jContentPane.setLayout(null);</p><p> jContentPane.add(ipHostLabel, null);</p><p> ?。?)標(biāo)簽 (JLabel)</p><
55、;p> 用來(lái)顯示文字,圖標(biāo)(可以文字與圖標(biāo)同時(shí)顯示)。</p><p> JLabel構(gòu)造方法</p><p> JLabel() 創(chuàng)建一個(gè)空標(biāo)簽</p><p> JLabel(String c) 指定標(biāo)簽文本</p><p> 起始端口標(biāo)簽的設(shè)計(jì)如下(其他類似):&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> 構(gòu)造方法</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ù)設(shè)計(jì)如下(其他類似):</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> (6)按鈕的創(chuàng)建</b></p><p><b> 構(gòu)造方法:</b></p><p><b> JButton()</b></p><p> JBu
62、tton(String c) 指定顯示文本</p><p> JButton(Icon image) 指定顯示圖標(biāo)</p><p> JButton(String c ,Icon image)</p><p> 申請(qǐng)按鈕函數(shù)實(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("申請(qǐng)");</p><p> okJButton.addActionListener(this);</p><p><b> }</b></p><p> return okJButton;</p><p><b> }</b></p><
65、p> ?。?)多行文本框(JTextArea)</p><p><b> 構(gòu)造方法</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> 常用設(shè)置方法</b></p><p> public void setLineWrap(boolean wrap):換行狀態(tài)設(shè)置</p><p> public
67、void setRows(int rows) :設(shè)置行數(shù)</p><p> public void setColumns(int columns):設(shè)置列數(shù)</p><p> 說(shuō)明:顏色、字體、內(nèi)容的設(shè)置同上(setForeground、setFont、setText)</p><p> 文本顯示框代碼設(shè)計(jì)如下:</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ù)實(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ù)庫(kù)的連接(查找刪改略):</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> //通過(guò)字節(jié)碼對(duì)象方式加載靜態(tài)代碼塊</p>&
74、lt;p> //從而注冊(cè)驅(qū)動(dòng)程序</p><p> Class.forName(driverClass);</p><p> } catch (ClassNotFoundException e) {</p><p> System.out.println("無(wú)法創(chuàng)建實(shí)體");</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> 這里主要是對(duì)數(shù)據(jù)庫(kù)的連接函數(shù)的編寫(xiě)以及函數(shù)的封裝,方便再一次使用時(shí)候直接調(diào)用,
77、而不用重新連接。</p><p> 將字符串轉(zhuǎn)換為公鑰的函數(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對(duì)稱加密算法</p><
79、;p> java.security.KeyFactory keyFactory;</p><p> keyFactory = java.security.KeyFactory.getInstance("RSA");</p><p><b> // 取公鑰匙對(duì)象</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í)候,都是字符串,所以不能直接用于數(shù)字簽名,不然會(huì)簽名失敗,所以這里首先是將字符串轉(zhuǎn)換為公鑰,然后返回公鑰。</p><p><b> 用戶證書(shū)簽名函數(shù):</b></p><p> public static boolean verifySign(X509
83、Certificate certificate,byte[] sign,byte[] original){ </p><p><b> try{ </b></p><p> //獲得簽名實(shí)例 </p><p> Signature signature=Signature.getInstance(certificate.getSigA
84、lgName()); </p><p> //用證書(shū)公鑰進(jìn)行初始化 </p><p> signature.initVerify(certificate.getPublicKey()); </p><p><b> //更新源數(shù)據(jù) </b></p><p> signature.update(origina
85、l); </p><p> //驗(yàn)證數(shù)字簽名 </p><p> return signature.verify(sign); </p><p> 首先,先獲得簽名實(shí)例,用證書(shū)公鑰進(jìn)行初始化驗(yàn),其次更新源數(shù)據(jù),然后驗(yàn)證數(shù)字簽名,并返回?cái)?shù)字簽名結(jié)果。這里需要注意的是,一定要先知道CA證書(shū)(CA頒發(fā)機(jī)構(gòu))數(shù)字簽名的算法,這是因?yàn)镃A證書(shū)的簽名算法是eclip
86、se里面的keystore自己確定的、隨機(jī)的,和代碼本身編寫(xiě)使用的算法不一定一樣,所以根據(jù)CA證書(shū)的算法采用相同的算法來(lái)確定驗(yàn)證數(shù)字簽名的算法才能保證簽名驗(yàn)證成功。</p><p><b> 用戶證書(shū)掛失函數(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> 首先為了防止非法用戶的惡意掛失行為,需要認(rèn)證掛失者的身份是否合
92、法,所以這里需要接收掛失者的id;通過(guò)認(rèn)證之后,再判斷該公鑰是否已經(jīng)被掛失,所以也需要傳入公鑰,最后把準(zhǔn)備作廢的公鑰存入到掛失的公鑰數(shù)據(jù)庫(kù)中。</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> 用戶在申請(qǐng)掛失后,首先得建立數(shù)據(jù)庫(kù)連接連
96、通數(shù)據(jù)庫(kù),將不受信任的公鑰存入到數(shù)據(jù)庫(kù)中,并返回?cái)?shù)據(jù)庫(kù)數(shù)據(jù)插入的結(jié)果。</p><p> 3.4 測(cè)試和運(yùn)行結(jié)果</p><p><b> 初始運(yùn)行界面:</b></p><p> 圖3-1 CA系統(tǒng)初始界面</p><p><b> 用戶證書(shū)申請(qǐng)功能:</b></p><
97、;p> 圖3-2 CA用戶證書(shū)申請(qǐng)成功</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ù)庫(kù):</p><p><b> 保存之前:</b></p><p> 圖3-6 吊銷公鑰保存之前</
99、p><p><b> 保存之后:</b></p><p> 圖3-7 吊銷公鑰保存成功</p><p><b> 生成證書(shū):</b></p><p> 圖3-8 吊銷公鑰保存成功</p><p> 4. 所遇到的問(wèn)題及分析解決</p><p>
100、 問(wèn)題一:在驗(yàn)證數(shù)字證書(shū)簽名時(shí),簽名失敗后,會(huì)代碼報(bào)錯(cuò)?</p><p> 解決辦法:缺少一個(gè)數(shù)字簽名結(jié)果返回值test,而且,這個(gè)簽名結(jié)果驗(yàn)證應(yīng)該放在保存用戶信息之前,并設(shè)置接受參數(shù),然后return即可。</p><p> 問(wèn)題二:無(wú)法實(shí)現(xiàn)從外面以字符串的方式傳遞用戶信息到生成用戶證書(shū)的函數(shù)中?</p><p> 解決辦法:將用戶信息用數(shù)組接收,代碼如下:
101、 </p><p><b> //設(shè)置用戶信息</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> 這樣就可以實(shí)現(xiàn)可變的接收用戶數(shù)據(jù),生成對(duì)應(yīng)的數(shù)字證書(shū)。</p><p> 問(wèn)題三:服務(wù)器無(wú)法接收到客戶
103、端發(fā)送的數(shù)據(jù)?</p><p> 解決辦法:原先設(shè)計(jì)的時(shí)候,Socket數(shù)據(jù)包是可以接收的,但是突然第二天來(lái)運(yùn)行就出錯(cuò)了,原先以為是代碼的編寫(xiě)錯(cuò)誤,但是使用之前的代碼也沒(méi)有接收成功,經(jīng)過(guò)幾天的卡殼,懷疑是eclipse版本的問(wèn)題,但是安裝最新版本后并沒(méi)解決,于是去請(qǐng)教同班同學(xué),問(wèn)題的解決辦法,經(jīng)過(guò)幾個(gè)鐘頭的調(diào)試也是沒(méi)有解決,最后沒(méi)辦法了,只能減少數(shù)據(jù)的接收了,好可惜,白忙活了幾天。只能先完成主要的功能了。<
104、;/p><p> 問(wèn)題四:用戶證書(shū)的數(shù)字簽名總是驗(yàn)證失?。?lt;/p><p> 解決辦法:首先,瀏覽編寫(xiě)的代碼,看一下是否是代碼的錯(cuò)誤,但是經(jīng)過(guò)幾天的檢查以及調(diào)試,發(fā)現(xiàn)代碼并沒(méi)有錯(cuò)誤,所以我懷疑是函數(shù)的問(wèn)題,于是便換了一個(gè)簽名函數(shù)以及用戶信息的接收函數(shù),但是問(wèn)題并沒(méi)有解決;沒(méi)辦法,懷疑是eclipse的JDK問(wèn)題,于是便下載了最新版的JDK,安裝之后運(yùn)行,但是簽名還是失敗了,這次真的是沒(méi)有辦
105、法了,于是便找同學(xué)幫忙,但是同學(xué)也沒(méi)有找到解決的辦法;于是,決定重新查閱書(shū)本,看到CA證書(shū)的簽名算法時(shí),突然想起可能是簽名算法出問(wèn)題了,我便查看了一下CA頒發(fā)證書(shū)的簽名算法,才恍然大悟,原來(lái)CA證書(shū)的簽名算法是sha256,而驗(yàn)證簽名的算法是sha1,欣喜之余,問(wèn)題終于解決了,也了解到,數(shù)字簽名和簽名驗(yàn)證的算法必須要一樣,不然簽名將永遠(yuǎn)無(wú)法驗(yàn)證成功。</p><p> 問(wèn)題五:MySQL報(bào)錯(cuò)?</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> 解決辦法:經(jīng)過(guò)瀏覽網(wǎng)頁(yè),可以知道這個(gè)錯(cuò)誤是因?yàn)闆](méi)有指明mysql的data路徑導(dǎo)致的:</p><p> vim /etc/my.cnf</p><p> 在[mysqld] 后面加上如下路徑:</p><p> basedir = /usr/lo
108、cal/mysql</p><p> datadir =/opt/data;</p><p> 這樣問(wèn)題就可以解決了。</p><p> 5. 系統(tǒng)特色及關(guān)鍵技術(shù)</p><p><b> 系統(tǒng)特色:</b></p><p> 吊銷公鑰的函數(shù)(位于My_DAO.java 73行)<
109、;/p><p> //用于將將不受信任的公鑰存入數(shù)據(jù)庫(kù)中</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、失,是通過(guò)將掛失的公鑰存入到不受信任的數(shù)據(jù)庫(kù)里面,然后再次用到該公鑰時(shí)候會(huì)彈出錯(cuò)誤提示,即達(dá)到了公鑰掛失的效果。</p><p> 接收用戶數(shù)據(jù)(位于MainUI.java 中的237行)</p><p> 個(gè)人信息的接收以及信息在函數(shù)之間調(diào)用的時(shí)候是通過(guò)一個(gè)數(shù)組來(lái)實(shí)現(xiàn)的,通過(guò)整個(gè)數(shù)組引用,這樣避免重復(fù)繁瑣,代碼實(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> 關(guān)鍵技術(shù):</b></p><p> CA公鑰對(duì)用戶
117、進(jìn)行簽名:(位于MyCertificate.java 中的146行)</p><p> // 用新證書(shū)信息封成為新X.509證書(shū)</p><p> newcert = new X509CertImpl(ClientInfo);</p><p> byte[] original=ClientInfo.getEncodedInfo();</p>&l
118、t;p> // 生成新正書(shū)驗(yàn)證碼</p><p> newcert.sign(CAPrivateKey, "sha256WithRSA");</p><p> byte[] sig=newcert.getSignature(); </p><p> 驗(yàn)證簽名 (位于MyCertificate.java 中的247行)</p&g
119、t;<p> Signature signature=Signature.getInstance(certificate.getSigAlgName()); </p><p> //用證書(shū)公鑰進(jìn)行初始化 </p><p> signature.initVerify(certificate.getPublicKey()); </p><p>&
120、lt;b> //更新源數(shù)據(jù) </b></p><p> signature.update(original); </p><p> //驗(yàn)證數(shù)字簽名 </p><p> return signature.verify(sign); </p><p> }catch(Exception e){ </p&
121、gt;<p> return false; </p><p> 這里通過(guò)加載CA證書(shū)獲取簽名的算法以及CA證書(shū)公鑰,然后將傳入進(jìn)來(lái)的已簽名數(shù)據(jù)進(jìn)行驗(yàn)證,然后返回驗(yàn)證結(jié)果。</p><p><b> 6. 結(jié)論及體會(huì)</b></p><p> 本次課程設(shè)計(jì),遇到的困難不少,有些問(wèn)題解決了,有些還是很迷糊,有些問(wèn)題甚至讓我換
122、了幾次題目,安裝了幾次軟件,就比如,其中遇到的數(shù)據(jù)包無(wú)法從客戶端發(fā)送到服務(wù)器,經(jīng)過(guò)幾次代碼的調(diào)試還是不行,安裝了最新版本eclipse軟件后還是沒(méi)能解決,反復(fù)糾結(jié)了幾天。最后,沒(méi)辦法,為了不但耽誤代碼的編寫(xiě),以及任務(wù)的順利的完成,只能先把問(wèn)題放一邊。另外,在剛開(kāi)始進(jìn)行代碼編寫(xiě)時(shí)發(fā)現(xiàn)自己好多的知識(shí)不懂、不熟悉,顯得很遲鈍,不寫(xiě)不知道,一寫(xiě)嚇一跳,很多的內(nèi)容之前掌握得還是可以的,但是由于很久沒(méi)寫(xiě)代碼,知識(shí)也忘得差不多了,導(dǎo)致花費(fèi)很多時(shí)間回去
123、梳理舊知識(shí),這就說(shuō)明了知識(shí)應(yīng)該經(jīng)常回去梳理,不然很容易生疏甚至忘記。</p><p> 從確定題目開(kāi)始,我就先開(kāi)始查閱相關(guān)書(shū)籍,瀏覽網(wǎng)頁(yè),把編程過(guò)程需要的材料收集好。其次,設(shè)計(jì)好總體的程序流程圖。最后,按部就班,把理論歸于實(shí)踐,進(jìn)行具體的Java編程了。由于上學(xué)期學(xué)習(xí)Java編程不夠深入,程序?qū)懙南鄬?duì)簡(jiǎn)單,并不是因?yàn)樵O(shè)計(jì)要求復(fù)雜到難以理解,而是本人的能力尚在基礎(chǔ)階段,正陷于梳理知識(shí)當(dāng)中,只能進(jìn)行簡(jiǎn)單的Java編
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息安全課程設(shè)計(jì)---金融服務(wù)系統(tǒng)
- 課程設(shè)計(jì)報(bào)告---學(xué)生信息查詢系統(tǒng)
- 物流信息系統(tǒng)課程設(shè)計(jì)報(bào)告
- 2007信息系統(tǒng)課程設(shè)計(jì)報(bào)告
- c++課程設(shè)計(jì)——學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 管理信息系統(tǒng)課程設(shè)計(jì)報(bào)告
- 定制公交信息系統(tǒng)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告--學(xué)生信息管理系統(tǒng)
- 管理信息系統(tǒng)課程設(shè)計(jì)報(bào)告
- 《管理信息系統(tǒng)》課程設(shè)計(jì)報(bào)告
- 學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 銷售信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 教室信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 超市信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 會(huì)計(jì)信息系統(tǒng)課程設(shè)計(jì)報(bào)告
- 管理信息系統(tǒng)課程設(shè)計(jì)報(bào)告
- 學(xué)生信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論