參考資料該文中的內(nèi)容來(lái)源于 Oracle 的官方文檔 Java SE Tools Reference 。Oracle 在 Java 方面的文檔是非常完善的。對(duì) Java 8 感興趣的朋友,可以直接找到這個(gè)總?cè)肟?Java SE 8 Documentation ,想閱讀什么就點(diǎn)什么。本博客不定期從 Oracle 官網(wǎng)搬磚。這里介紹的工具是 keytool 。 網(wǎng)絡(luò)安全概論在 Web 世界里,安全是一個(gè)重之又重的課題,甚至是美國(guó)政府都禁止某些加密解密算法的出口。 Java 和 Linux 都是 Web 領(lǐng)域的領(lǐng)頭羊,各種加解密的算法和管理工具一應(yīng)俱全,例如 GnuPG 就是一個(gè)不錯(cuò)的安全套件。但是在這里,只展示一下 JDK 中的 keytool 工具的使用方法。 先來(lái)說(shuō)一下加解密算法的分類(lèi)?;旧峡梢苑譃槿?lèi),它們分別是對(duì)稱性解密算法、非對(duì)稱性加密算法和消息摘要算法。每一類(lèi)算法中又有多個(gè)不同的具體算法。對(duì)于這些算法,我們不要求完全掌握,但是對(duì)于各類(lèi)算法的特點(diǎn)和用途是一定要了解的,對(duì)于一些常見(jiàn)的名字,如 DES、AES、RSA、DSA、MD5、SHA1 等,一定要熟悉,至少要知道它們分別屬于哪類(lèi)算法。 對(duì)稱性加密算法使用同一個(gè)密鑰對(duì)信息進(jìn)行加密和解密,其信息的安全性一部分取決于加密算法和密鑰的長(zhǎng)度,另一部分取決于密鑰在傳遞過(guò)程中是否會(huì)被截獲或盜取。非對(duì)稱性加密算法使用兩個(gè)密鑰分別對(duì)信息進(jìn)行加密和解密,這兩個(gè)密鑰稱為私鑰/公鑰對(duì)。使用私鑰加密的信息必須使用公鑰解密,反之亦然。公鑰可以公開(kāi)發(fā)布,私鑰由加密方保存,絕對(duì)不公開(kāi),將私鑰被截獲或竊取的可能性降到最低,因此非對(duì)稱性加密算法的安全性比對(duì)稱性加密算法的安全性更高。既然非對(duì)稱性加密算法比對(duì)稱性加密算法安全性更高,那對(duì)稱性加密算法有什么存在的必要呢?這是因?yàn)閷?duì)稱性加密算法的運(yùn)算速度更快?,F(xiàn)實(shí)中,往往將對(duì)稱性加密算法和非對(duì)稱性加密算法結(jié)合使用,對(duì)于要傳輸?shù)拇髩K數(shù)據(jù)使用對(duì)稱性加密算法加密,然后對(duì)加密使用的密鑰使用非對(duì)稱性加密算法進(jìn)行加密,這樣既可以獲得更高的安全性,又可以獲得更高的加解密運(yùn)算速度。常用的對(duì)稱性加密算法有DES算法、AES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法。常用的非對(duì)稱性加密算法有DSA算法、RSA算法、Elgamal算法、背包算法、Rabin算法、D-H算法、ECC算法(橢圓曲線加密算法)。 消息摘要算法的主要目的是對(duì)數(shù)據(jù)生成摘要。消息摘要算法不需要密鑰,只有輸入相同的數(shù)據(jù)才能得到相同的摘要,而且不可能從摘要反過(guò)來(lái)推算出數(shù)據(jù)。常用的消息摘要算法有MD5算法和SHA-1算法及其大量的變體。它們可以用來(lái)保證數(shù)據(jù)的完整性,在網(wǎng)絡(luò)上發(fā)布文件時(shí),常同時(shí)提供該文件的MD5值就是利用的消息摘要算法的這個(gè)特點(diǎn),一旦該文件被篡改或者在網(wǎng)絡(luò)傳輸中出現(xiàn)數(shù)據(jù)錯(cuò)誤,再對(duì)其進(jìn)行摘要運(yùn)算就得不到相同的MD5值。 對(duì)數(shù)據(jù)進(jìn)行簽名是我們?cè)诰W(wǎng)絡(luò)中最常見(jiàn)的安全操作。簽名有雙重作用,作用一就是保證數(shù)據(jù)的完整性,證明數(shù)據(jù)并非偽造,而且在傳輸?shù)倪^(guò)程中沒(méi)有被篡改,作用二就是防止數(shù)據(jù)的發(fā)布者否認(rèn)其發(fā)布了該數(shù)據(jù)。簽名同時(shí)使用了非對(duì)稱性加密算法和消息摘要算法,對(duì)一塊數(shù)據(jù)簽名時(shí),會(huì)先對(duì)這塊數(shù)據(jù)進(jìn)行消息摘要運(yùn)算生成一個(gè)摘要,然后對(duì)該摘要使用發(fā)布者的私鑰進(jìn)行加密。接收者接受這塊數(shù)據(jù)后,先使用發(fā)布者的公鑰進(jìn)行解密得到原數(shù)據(jù)的摘要,再對(duì)接收到的數(shù)據(jù)計(jì)算摘要,如果兩個(gè)摘要相同,則說(shuō)明數(shù)據(jù)沒(méi)有被篡改。同時(shí),因?yàn)榘l(fā)布者的私鑰是不公開(kāi)的,只要接收者通過(guò)發(fā)布者的公鑰能成功對(duì)數(shù)據(jù)進(jìn)行解密,就說(shuō)明該數(shù)據(jù)一定來(lái)源于該發(fā)布者,他再怎么抵賴也沒(méi)有用。 那么問(wèn)題來(lái)了,怎么確定某公鑰一定是屬于某發(fā)布者的呢?這就需要證書(shū)了。證書(shū)由權(quán)威認(rèn)證機(jī)構(gòu)頒發(fā),其內(nèi)容包含證書(shū)所有者的標(biāo)識(shí)和它的公鑰,并由權(quán)威認(rèn)證機(jī)構(gòu)使用它的私鑰進(jìn)行簽名。信息的發(fā)布者通過(guò)在網(wǎng)絡(luò)上發(fā)布證書(shū)來(lái)公開(kāi)它的公鑰,該證書(shū)由權(quán)威認(rèn)證機(jī)構(gòu)進(jìn)行簽名,認(rèn)證機(jī)構(gòu)也是通過(guò)發(fā)布它的證書(shū)來(lái)公開(kāi)該機(jī)構(gòu)的公鑰,認(rèn)證機(jī)構(gòu)的證書(shū)由更權(quán)威的認(rèn)證機(jī)構(gòu)進(jìn)行簽名,這樣就形成了證書(shū)鏈。證書(shū)鏈最頂端的證書(shū)稱為根證書(shū),根證書(shū)就只有自簽名了??傊?,要對(duì)網(wǎng)絡(luò)上傳播的內(nèi)容進(jìn)行簽名和認(rèn)證,就一定會(huì)用到證書(shū)。關(guān)于證書(shū)遵循的標(biāo)準(zhǔn),最流行的是 X.509,關(guān)于證書(shū)的具體內(nèi)容,網(wǎng)絡(luò)上一搜一大把,我這里就不講了。 使用keytool創(chuàng)建和管理證書(shū) 在 Java 中也廣泛使用證書(shū),例如,使用 下面開(kāi)始實(shí)戰(zhàn)。要進(jìn)行非對(duì)稱性加密,我們首先要有屬于自己的私鑰/公鑰對(duì),這可以通過(guò) 先將自己假想為一個(gè)認(rèn)證機(jī)構(gòu),或者說(shuō)一個(gè)只對(duì)我自己簽發(fā)證書(shū)的私有認(rèn)證機(jī)構(gòu),我稱之為 MyCA,先為 MyCA 生成一個(gè)自簽名的根證書(shū),使用的命令是 如果給 然后,再為我自己生成一個(gè)密鑰對(duì),使用命令 使用 自簽名的證書(shū)可以使用,但是總不如認(rèn)證機(jī)構(gòu)頒發(fā)的證書(shū)權(quán)威。怎么樣讓 CA 為我們頒發(fā)證書(shū)呢?首先我們要向 CA 提交申請(qǐng),提交申請(qǐng)的時(shí)候需要提交一份稱為 certificate request 的數(shù)據(jù)。我們可以通過(guò) 然后,申請(qǐng)者收到 CA 頒發(fā)的證書(shū)后,可以使用 作為管理工具,keytool 當(dāng)然提供導(dǎo)出證書(shū)的功能,使用 總結(jié) keytool 的使用方法很簡(jiǎn)單,重要的也就是 (京山游俠于2015-04-22發(fā)布于博客園,轉(zhuǎn)載請(qǐng)注明出處。) |
|
|