日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java安全——数字签名+代码签名

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java安全——数字签名+代码签名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README 1)本文文字描述轉自 core java volume 2, 旨在學習?java安全——數字簽名 的基礎知識; 2)本文實踐內容以及截圖筆記均為原創;

3)如果要給予applet更多的信賴,你必須知道下面兩件事:

3.1)?applet來自哪里?

3.2)?在傳輸過程中代碼是否被破壞?

-------------------------------------------------------------------------------------------------------
【1】消息摘要

1)消息摘要(message digest):?是數據塊的數字指紋。(干貨——消息摘要定義)

2)消息摘要具有兩個基本屬性(properties):

p1)?如果數據的1位或者幾位改變了,那么消息摘要也將改變。

p2)?擁有給定消息的偽造者不能創建與原消息具有相同摘要的假消息。

3)看個荔枝:

讓我們來看看下面這位億萬富翁留下的遺囑:?"我死了之后,我的財產將由我的孩子平分,但是,我的兒子George應該拿不到一個子。" ?這份遺囑的SHA1指紋為:?2D 8B 35 F3 BF 49 CD B1 94 04 E0 66 21 2B 5E 57 70 49 E1 7E;這位有疑心病的父親將這份遺囑交給一位律師保存,而將指紋交給另一位律師保存。現在,假設George能夠賄賂那位保存遺囑的律師,他想修改這份遺囑,使得Bill一無所得。當然,這需要將原指紋改為下面這樣完全不同的位模式:?2A 33 0B 4B B3 FE CC 1C 9D 5C 01 A7 09 51 0B 49 AC 8F 98 92;?那么George能夠找到與該指紋相匹配的其他文字嗎?如果從地球形成之時,他就很自豪地擁有10億臺計算機,每臺計算機每秒鐘能處理一百萬條信息,他依然無法找到一個能夠替換的遺囑。

4) 計算消息摘要的算法: ?其中最著名的兩種算法是SHA1和MD5。SHA1是由美國國家標準和技術學會開發的加密散列算法,MD5是由麻省理工學院的Ronald Rivest發明的算法。 5)Attention:許多密碼人員建議最好避免使用MD5,而應該使用SHA1算法,直到有更強的加密算法出現。(干貨——許多密碼人員建議最好避免使用MD5,而應該使用SHA1算法)

6)Java編程語言已經實現了SHA1和MD5。

6.1)MessageDigest類:?是用于創建封裝了指紋算法的對象的"工廠",它的靜態方法getInstance返回繼承了MessageDigest類的某個類的對象。

6.2) 這意味著MessageDigest類能夠承擔下面的雙重職責(responsibilities):

r1)作為一個工廠類。
r2)作為所有消息摘要算法的超類。

6.2)如何獲取消息摘要:

step1)下面是如何獲取一個能夠計算SHA指紋的對象的方法:

MessageDigest alg = MessageDigest.getInstance("SHA-1");or MessageDigest alg = MessageDigest.getInstance("MD5");
step2) 當你已經獲取MessageDigest對象之后,通過反復調用update方法,將信息中的所有字節提供給該對象。

InputStream in = . . . int ch; while ((ch = in.read()) != -1) alg.update((byte) ch);


step2.1)如果這些字節存放在一個數組中,那就可以一次完成整個數組的更新:?

byte[] bytes = . . .; alg.update(bytes);
step3)?當完成上述操作后,調用digest方法。該方法填充輸入信息-指紋算法需要的-并且進行相應的計算,然后以字節數組的形式返回消息摘要。

byte[] hash = alg.digest();


for complete source code, please visit ??https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter9/digital_signature/Digest.java?

【2】消息簽名 1)我們介紹了如何計算原始消息的消息摘要和指紋的方法。如果消息改變了,那么改變后的消息的指紋與原消息的指紋將不匹配。如果消息和它的指紋是分開傳送的,那么接收者就可以檢查消息是否被篡改過。 2)problem+solution:? 2.1)problem:但是,如果消息和指紋同時被截獲了,對消息進行修改,再重新計算指紋,這是一件很容易的事情。畢竟,消息摘要算法是公開的,不需要使用任何密鑰。在這種情況下,假消息和新指紋的接收者永遠不會知道消息已經被篡改。 2.2)solution:?數字簽名解決了這個問題。(干貨——引入數字簽名的原因) 3)公共密鑰加密技術:?是基于公共密鑰和私有密鑰這個兩個基本概念的。 3.1)它的設計思想是:?你可以將公共密鑰告訴世界上的任何人,但是,只有自己才擁有私有密鑰,重要的是你要保護你的私有密鑰,不將它泄漏給其他任何人。這些密鑰之間存在一定的數學關系,但是這種關系的具體性質對于實際的編程來說并不重要。 3.2)在現實中,幾乎不可能用一個密鑰去推算出另一個密鑰。也就是說,即使每個人都知道你的公共密鑰,不管他們擁有多少計算資源,他們一輩子也無法計算出你的私有密鑰。
4)看個荔枝(使用DSA 算法 進行公共密鑰簽名的交換)

4.1)荔枝背景:假設Alice想要給Bob發送一個消息,Bob想知道該消息是否來自Alice,而不是冒名頂替者。Alice寫好了消息,并且用她的私有密鑰對該消息摘要簽名。Bob得到了她的公共密鑰的拷貝,然后Bob用公共密鑰對該簽名進行校驗。

4.2)如果通過了校驗,則Bob可以確認以下兩個事實(truth):

t1)?原始消息沒有被篡改過;

t2)?該消息是由Alice簽名的,她是私有密鑰的持有者,該私有密鑰就是與Bob用于校驗的公共密鑰相匹配的密鑰;

4.3)你可以看到私有密鑰的安全性為什么是最重要的。?如果某個人偷了Alice的私有密鑰,或者政府要求她交出私有密鑰,那么她就麻煩了。小偷或者政府代表就可以假扮她的身份來發送消息和資金轉帳指令等等,而其他人則會相信這些消息確實來自于Alice。



【3】校驗簽名 1)JDK配有一個keytool程序:該程序是一個命令行工具,用于生成和管理一組證書。 2)我們現在要做的是:?使用keytool工具來展示Alice是如何對一個文檔進行簽名并且將它發送給Bob的,而Bob又是如何校驗該文檔確實是由Alice簽名,而不是冒名頂替的。

3)keytool程序的功能: 負責管理密鑰庫、證書數據庫和私有密鑰。密鑰庫中的每一項都有一個"別名"。

3.1)看個荔枝:下面展示的是Alice如何創建一個密鑰庫alice.store 并且用別名生成一個密鑰對的。

keytool -genkey -keystore alice.store -alias alice

3.2)當生成一個密鑰時,系統提示你輸入下面這些信息:
3.3)?假設Alice想把她的公共密鑰提供給Bob,她必須導出一個證書文件:(干貨——證書的定義和作用)
3.4)?這時,Alice就可以把證書發送給Bob。當Bob收到該證書時,他就可以將證書打印出來:
3.5)如果Bob想檢查他是否得到了正確的證書,可以給Alice打電話,讓她在電話里讀出證書的指紋。 3.6)一旦Bob信任該證書,他就可以將它導入密鑰庫中。

4)現在Alice就可以開始給Bob發送簽過名的文檔了 4.1)jarsigner工具負責對JAR文件進行簽名和校驗,Alice只需要將文檔添加到要簽名的JAR文件中。 jar cvf document.jar document.txt 4.2)然后她使用jarsigner工具將簽名添加到文件中,她必須指定要使用的密鑰庫、JAR文件和密鑰的別名。

4.3)當Bob收到JAR文件時,他可以使用jarsigner程序的-verify選項,對文件進行校驗。 jarsigner -verify -keystore bob.store document.jar

4.4)Bob不需要設定密鑰別名。該jarsigner程序會在數字簽名中找到密鑰所有者的X.500名字,并在密鑰庫中搜尋匹配的證書。

4.5)如果JAR文件沒有受到破壞而且簽名匹配,那么jarsigner程序將打印:??jar verified.?否則,程序將顯示一個出錯消息。



【4】認證問題

1)看個荔枝:假設你從一個聲稱代表某著名軟件公司的陌生人那里獲得了一個消息,他要求你運行消息附帶的程序。這個陌生人甚至將他的公共密鑰的拷貝發送給你,以便讓你校驗他是否是該消息的作者。你檢查后會發現該簽名是有效的,這就證明該消息是用匹配的私有密鑰簽名的,并且沒有遭到破壞。這時候你要小心:你仍然不清楚誰寫的這條消息。

2)認證問題定義:任何人都可以生成一對公共密鑰和私有密鑰,再用私有密鑰對消息進行簽名,然后把簽名好的消息和公共密鑰發送給你。這種確定發送者身份的問題稱為"認證問題"。(干貨——認證問題定義)

3)認證問題的solution:?解決這個認證問題的通常做法是比較簡單的。假設陌生人和你有一個你們倆都值得信賴的共同熟人。假設陌生人親自約見了該熟人,將包含公共密鑰的磁盤交給了他。后來,你的熟人與你見面,向你擔保他與該陌生人見了面,并且該陌生人確實在那家著名的軟件公司工作,然后將磁盤交給你 。如此這樣,你的熟人就證明了陌生人身份的真實性。


4)你不需要與熟人見面的:?取而代之的是,他可以將他的私有簽名應用于陌生人的公共密鑰文件之上即可。
5)信任模型:?然而,你們之間可能沒有共同的熟人。有些信任模型假設你們之間總是存在一個"信任鏈"-即一個共同熟人的鏈路-這樣你就可以信任該鏈中的每個成員。
6)你常常會遇到由負責擔保他人身份的一個或多個實體簽署的數字簽名。你必須評估一下究竟能夠在多大程度上信任這些身份認證人。你可能非常信賴VeriSign公司,因為也許你在許多網頁中都看到過他們公司的標志,或者你曾經聽說過,每當有新的萬能密鑰產生時,他們就會要求在一個非常保密的會議室中聚集眾多揣著黑色公文包的人進行磋商。
【5】證書簽名 1)problem+solution: 1.1)problem:假設Alice想要給同事 Cindy 發送一條經過簽名的消息,但是Cindy并不希望因為要校驗許多簽名指紋而受到困擾。 1.2)solution:?假設有一個Cindy信任的實體來校驗這些簽名。在這個例子中,Cindy信任ACME軟件公司的信息資源部。 2)證書授權(CA-certificate authorization)的過程: step1)?首先?需要創建一個密鑰庫acmesoft.store,生成一個密鑰對并導出公共密鑰;
step2)?其中的公共密鑰被導入到了一個自簽名的證書中,然后將其添加到每個雇員的密鑰庫中:
step3)如果Alice要發送消息給Cindy以及ACME軟件公司的其他任何人,她需要將她自己的證書簽名, 并提交給信息資源部。 step4)?現在,Cindy將簽名的證書導入到她的密鑰庫中: keytool -importcert -keystore cindy.certs -alias alice -file alice_signedby_acmeroot.cer step5)密鑰庫要進行校驗,以確定該密鑰是由密鑰庫中已有的受信賴的根密鑰簽過名的,而且Cindy不必對證書的指紋進行校驗。?一旦Cindy添加了根證書和經常給她發送文檔的人的證書后,她就再也不用擔心密鑰庫了。

【6】證書請求? 1)problem+solution? 1.1)problem:?在前一節中,我們用密鑰庫和CertificateSigner工具模擬了一個CA。但是,大多數CA都運行著更加復雜的軟件來管理證書,并且使用的證書格式也略有不同。本節將展示與這些軟件包進行交互時需要增加的處理步驟。 1.2)solution:我們將用OpenSSL軟件包作為實例。(干貨——OpenSSL 可以生成 CA(certificate authentication-證書授權)) 2)solution的具體步驟: step1)為了創建一個CA,需要運行CA腳本 , 如? /usr/lib/ssl/misc/CA.pl -newca 這個腳本會在當前目錄中創建一個demoCA子目錄,這個目錄包含了一個根密鑰對和有關證書與證書撤銷列表的存儲。

(openssl req -new -out my.pem
step2)你希望將這個公共密鑰導入到所有雇員的Java密鑰庫中,但是它的格式是隱私增強型郵件(PEM-Private Enhanced Mail)格式,而不是密鑰庫更容易接受的DER格式。將文件demoCA/cacert.pem 復制成文件acmeroot.pem,然后在文本編輯器中打開這個文件。移除下面這行之前的所有內容:
-----BEGIN CERTIFICATE-----

以及下面這行之后的所有內容:

-----END CERTIFICATE-----

step3)現在可以按照通常的方式將acmeroot.pem導入到每個密鑰庫中了:

keytool -importcert -keystore cindy.certs -alias alice -file acmeroot.pem

這看起來有點不可思議,keytool竟然不能自己去執行這種編輯操作。

step4)要對Alice的公共密鑰簽名,需要生成一個證書請求,它包含這個PEM格式的證書:

keytool -certreq -keystore alice.store -alias alice -file alice.pem

step5)要簽名這個證書,需要運行:

openssl ca -in alice.pem -out alice_signedby_acmeroot.pem

step6)與前面一樣,在alice_signedby_acmeroot.pem中切除BEGIN CERTIFICATE/END CERTIFICATE標記之外的所有內容。然后,將其導入到密鑰庫中:

keytool -importcert -keystore cindy.certs -alias alice -file
alice_signedby_acmeroot.pem

你可以使用相同的步驟,使一個證書得到諸如VeriSign這樣的公共證書權威機構的簽名。

-------------------------------------------------------------------------------------------------------------------------------

【7】代碼簽名

1)認證技術最重要的一個應用是對可執行程序進行簽名。 2)應用背景:?如果從網上下載一個程序,自然會關心該程序可能帶來的危害,例如,該程序可能已經感染了病毒。如果知道代碼從何而來,并且它從離開源頭后就沒有被篡改過,那么放心程度會比不清楚這些信息時要高得多。事實上,如果該程序是用Java語言編寫的,那么就可以利用這些信息來理性地決定應該讓該程序擁有什么樣的優先權。
【7.1】 JAR 文件簽名
1)下面是兩種cases: c1) 在企業內聯網上傳遞:?系統管理員在本地機器上安裝證書和策略文件。每當Java插件工具加載經過簽名的代碼時,它就會查詢密鑰庫的簽名和策略文件中的權限。安裝證書和策略非常簡單,每個桌面只需要安裝一次。

c2) 在公眾因特網上傳遞:?軟件供應商獲取由證書發放權威(如VeriSign公司)簽名的證書。當最終用戶訪問一個包含已簽名applet的Web站點時,就會彈出一個對話框,顯示軟件供應商的相關信息,并給最終用戶兩個選擇,一個是給予applet全部權限,另一個是繼續在沙盒中運行。

2)在本節的剩余部分:?我們將要介紹如何建立策略文件,來為已知來源的代碼賦予特定的權限。創建和部署這些策略文件不是普通最終用戶要做的,然而,系統管理員在準備部署企業內聯網程序時需要做這些工作。(干貨——我們將要介紹如何建立策略文件,來為已知來源的代碼賦予特定的權限。) 3)看個荔枝:ACME對含有程序代碼的JAR文件進行簽名的steps: Attention) ?.certs 后綴表示密鑰庫,而.cer后綴表示證書; step1)ACME生成根證書:?keytool -genkeypair -keystore acmesoft.certs -alias acmeroot?
<span style="font-family: 微軟雅黑; font-size: 16px; line-height: 1.5;">D:\tmp>mkdir jar_signature</span><span style="font-family: 微軟雅黑; font-size: 16px; line-height: 1.5;">D:\tmp>cd jar_signature</span>D:\tmp\jar_signature>keytool -genkeypair -keystore acmesoft.certs -alias acmeroot 輸入密鑰庫口令: 再次輸入新口令: 您的名字與姓氏是什么?[Unknown]: tang 您的組織單位名稱是什么?[Unknown]: swjtu 您的組織名稱是什么?[Unknown]: swjtu 您所在的城市或區域名稱是什么?[Unknown]: chengdu 您所在的省/市/自治區名稱是什么?[Unknown]: sichuan 該單位的雙字母國家/地區代碼是什么?[Unknown]: CN CN=tang, OU=swjtu, O=swjtu, L=chengdu, ST=sichuan, C=CN是否正確?[否]: y 輸入 <acmeroot> 的密鑰口令(如果和密鑰庫口令相同, 按回車): 再次輸入新口令: D:\tmp\jar_signature>dir驅動器 D 中的卷是 軟件卷的序列號是 0006-7799D:\tmp\jar_signature 的目錄 2016/02/21 22:05 <DIR> . 2016/02/21 22:05 <DIR> .. 2016/02/21 22:05 1,274 acmesoft.certs1 個文件 1,274 字節2 個目錄 21,075,292,160 可用字節
step2)我們為公共證書建立第二個密鑰庫client.certs,并將公共的acmeroot證書添加進去:? keytool -exportcert -keystore acmesoft.certs -alias acmeroot -file acmeroot.cer
keytool -importcert -keystore client.certs -alias acmeroot -file acmeroot.cer D:\tmp\jar_signature>keytool -exportcert -keystore acmesoft.certs -alias acmeroot -file acmeroot.cer 輸入密鑰庫口令: 存儲在文件 <acmeroot.cer> 中的證書 D:\tmp\jar_signature>keytool -importcert -keystore client.certs -alias acmeroot -file acmeroot.cer 輸入密鑰庫口令: 再次輸入新口令: 所有者: CN=tang, OU=swjtu, O=swjtu, L=chengdu, ST=sichuan, C=CN 發布者: CN=tang, OU=swjtu, O=swjtu, L=chengdu, ST=sichuan, C=CN 序列號: 717a234 有效期開始日期: Sun Feb 21 22:14:20 CST 2016, 截止日期: Sat May 21 22:14:20 CST 2016 證書指紋:MD5: 4E:6A:EA:66:B1:67:69:44:61:5F:E1:D0:51:12:18:EFSHA1: BF:E0:B8:76:E5:FA:A6:F6:E5:33:31:0B:B7:68:45:81:97:07:9B:FFSHA256: 1D:26:85:E1:62:C9:43:E3:28:C5:3F:AD:E7:D3:C8:C7:6A:24:92:14:18:2F:71:EF:28:7D:16:9B :6D:AD:1A:28簽名算法名稱: SHA1withDSA版本: 3 擴展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: A8 83 5A D8 8C 45 4C 0D C2 9A 4B 1D D5 8F 8B 3E ..Z..EL...K....> 0010: 8C 3F 47 14 .?G. ] ] 是否信任此證書? [否]: y 證書已添加到密鑰庫中
step3)為了創建一個經過簽名的JAR文件,首先將各個類文件添加到JAR文件中,例如, javac HelloWorld.java
jar cvf HelloWorld.jar *.class D:\tmp\jar_signature>javac HelloWorld.java D:\tmp\jar_signature>jar cvf HelloWorld.jar *.class 已添加清單 正在添加: HelloWorld.class(輸入 = 428) (輸出 = 292)(壓縮了 31%)step4)然后ACME中某個信任的人運行jarsigner工具,指定JAR文件和私有密鑰的別名:?jarsigner -keystore acmesoft.certs HelloWorld.jar acmeroot 被簽名的applet現在就已經準備好在Web服務器中部署了。

D:\tmp\jar_signature>jarsigner -keystore acmesoft.certs HelloWorld.jar acmeroot 輸入密鑰庫的密碼短語: jar 已簽名。 警告: 簽名者證書將在六個月內過期。 未提供 -tsa 或 -tsacert, 此 jar 沒有時間戳。如果沒有時間戳, 則在簽名者證書的到期日期 (2016-05-21) 或 以后的任何撤銷日期之后, 用戶可能無法驗證此 jar。

step5)?接著,讓我們轉而配置客戶機。必須將一個策略文件發布到每一臺客戶機上。為了引用密鑰庫,策略文件將以下面這行開頭: keystore "keystoreURL", "keystoreType"; step5.1)?其中,URL可以是絕對的或相對的,其中相對URL 是相對于策略文件的位置而言的。如果密鑰庫是由keytool工具生成的,則它的類型是JKS。例如:? keystore "file:certs.store", "JKS"; ""grant子句可以有signedBy "alias"后綴,例如: grant signedBy "acmeroot"
{
. . .
}; 所有可以用與別名相關的公共密鑰進行校驗的簽名代碼現在都已經在grant語句中被授予了權限。
step6)?創建一個包含如下內容的策略文件HelloWorld.policy: keystore "client.certs" "JKS" grant signedBy "acmeroot" { permission java.lang.RuntimePermission "usePolicy"; permission java.io.FilePermission "D:\tmp\jar_signature\", "read"; }; step7)?最后,告訴applet瀏覽器使用該策略文件: appletviewer -J-Djava.security.policy=HelloWorld.policy FileReadApplet.htm
Attention)?當然,我們這里沒有用 applet class 作為實例文件,而是用 的 普通的一個讀取 ?D:\tmp\jar_signature\ 目錄下的文件的一個java 文件;

-------------------------------------------------------------------------------------------------------------------------------

【7.2】軟件開發者證書 1)應用背景: ?假設當你在因特網上沖浪時,遇到了一個Web站點,倘若你通過彈出的對話框為它授予了需要的權限,它就會運行一個來自不明提供商的applet或者Web啟動應用。 這樣的程序是用由證書權威機構發放的"軟件開發者"證書進行簽名的。彈出的對話框用于確定軟件開發者和證書發放者的身份。

2)現在你有兩個選擇(select):

s1)用全部權限運行程序,或者

s2)將程序限制在沙盒中運行。(對話框中的Cancel按鈕是一種誤導。如果點擊這個按鈕,applet不會被取消,而是運行在沙盒中。)

3)那么什么樣的因素可能會影響你的決定呢?下面是已經了解的情況:

3.1)?Thawte公司將一個證書賣給了軟件開發人員。

3.2)?程序確實是用該證書簽名的,并且在傳輸過程中沒有被篡改過。

3.3)?該證書確實是由Thawteit簽名的,它是用本地cacerts文件中的公共密鑰校驗的。

4) 是否就意味著該代碼可以安全運行了?

4.1)如果你只知道供應商的名字,以及Thawte公司賣給他們一個軟件開發者證書這個事實,那么你會信賴該供應商嗎?

4.2)如果想要擔保ChemAxon Kft.不是個徹頭徹尾的破解者,恐怕連Thawte公司自己也會陷入麻煩之中。

4.3)然而,沒有一個證書發放者會對軟件供應商的誠信度和資格能力進行廣泛的審查。

Conclusion)?對于用軟件開發者證書,我們沒有太大的熱情。?如果在公共互聯網上的applet和網絡啟動的應用程序更努力地保持在它們各自的沙盒中運行,而這些沙盒又能夠得到改進,那情況就會好得多。


總結

以上是生活随笔為你收集整理的java安全——数字签名+代码签名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。