寫在前面
你哼著小曲喻鳄,打開招商銀行的網(wǎng)站拆宛,想查查看今年的獎金到賬了沒有。突然键袱,一個想法驚出你一身冷汗:萬一打開的是李鬼的招商銀行網(wǎng)站燎窘,一輸入密碼登錄,不是密碼全被不法分子竊取了么蹄咖?瀏覽器怎么判斷這是一個可信的網(wǎng)站褐健,而不是某李鬼網(wǎng)站呢?要回答這個問題澜汤,得從數(shù)字證書及數(shù)字簽名的原理談起蚜迅。實際上,本文要介紹的這些知識俊抵,也是當前火熱的區(qū)域鏈技術(shù)的基礎(chǔ)谁不。
摘要算法
要談清楚這些問題,需要先了解一下摘要算法务蝠。摘要算法根據(jù)輸入計算出摘要拍谐。
它的特點是:
- 定長輸出:不管輸入的數(shù)據(jù)是是長還是短烛缔,只要選定了特定的摘要算法馏段,其輸出的長度就是固定的轩拨。比如 SHA256 輸出的摘要算法就是 32 字節(jié)。
- 碰撞概率低:絕對不碰撞是不可能的院喜,但好的摘要算法能做到非常低的碰撞概率亡蓉。從應(yīng)用的角度來看,基本上可以理解為一個輸入對應(yīng)一個輸出喷舀,當輸入改變了砍濒,輸出也跟著改變。
- 單向性:摘要算法是不可逆的硫麻。一個輸入對應(yīng)著一個輸出爸邢,但從輸出無法倒推出輸入。
數(shù)據(jù)指紋
摘要算法的這個特點經(jīng)常被用來計算數(shù)據(jù)的指紋拿愧,然后進行指紋驗證杠河。常用的摘要算法有 SHA1, SHA256, MD5 等等。SHA256 摘要算法的輸出是 32 個字節(jié)浇辜,MD5 的摘要算法是 16 字節(jié)券敌。比如,網(wǎng)站登錄時柳洋,用戶會網(wǎng)頁上輸入密碼待诅,服務(wù)器端要對輸入的密碼進行驗證。此時網(wǎng)頁前端不必把密碼直接發(fā)送給服務(wù)器去驗證熊镣,而是使用摘要算法計算密碼的指紋卑雁,并把這個摘要信息發(fā)送給服務(wù)器進行驗證(這樣可以減少密碼被人截獲的風險),這樣服務(wù)器只要拿相同的摘要算法也算一下密碼的摘要绪囱,對比兩個摘要是否相同即可知道用戶輸入的密碼是否正確测蹲。
備注:服務(wù)器的規(guī)范做法,不會保存密碼的原文在數(shù)據(jù)庫里的毕箍,一般通用的做法是生成一個隨機的鹽值弛房,稱為 salt,然后計算并保存密碼加鹽的摘要而柑。
另外一個常用的場景是文捶,對文件的完整性進行驗證。比如媒咳,你從網(wǎng)站上下載了一個文件粹排,下載提供方還會提供這個文件的 MD5 摘要信息,你把這個文件下載下來后涩澡,可以計算一下這個文件的 MD5 摘要顽耳,然后和網(wǎng)站提供的 MD5 對比,如果一樣,說明下載下來的文件是完整的射富;如果不一致膝迎,說明下載下來的文件是不完整的。
非對稱加密算法
非對稱加密算法和摘要算法胰耗,構(gòu)成了數(shù)字簽名和數(shù)字證書的基礎(chǔ)限次。非對稱加密算法的最大特點是:加密時使用的密鑰和解密時使用的密鑰是不一樣的。即柴灯,非對稱加密算法有兩套密碼卖漫,分別稱為私鑰和公鑰,私鑰私密保存赠群,只有自己知道羊始;公鑰可以發(fā)給通信的對端。私鑰加密的數(shù)據(jù)查描,只有對應(yīng)的公鑰能解密突委,公鑰加密的信息,只有私鑰能解密叹誉。用大白話鸯两,使用非對稱加密算法來加密通信的數(shù)據(jù)后,我對外發(fā)的信息別人都能解讀(因為公鑰任何人都可以得到长豁,是公開的)钧唐,但別人給我發(fā)的信息,只有我能解讀(因為只有我自己有私鑰匠襟,能解密)钝侠。
備注:與非對稱加密算法對應(yīng)的是對稱加密算法。對稱加密算法的密碼只有一個酸舍,通信雙方共享這個密碼帅韧。常用的對稱加密算法有 AES, DES 等。
數(shù)字簽名
常用的非對稱加密算法有 RSA 和 ECC 等啃勉。非對稱算法最經(jīng)典的應(yīng)用忽舟,是結(jié)合摘要算法對數(shù)據(jù)進行簽名。現(xiàn)實生活中淮阐,簽名的物理意義叮阅,是表示簽下名字的主體認可被簽名數(shù)據(jù)的有效性。比如泣特,紙面簽名是使用筆寫上自己的名字浩姥,在簽名認證時,通過確認筆跡來進行確認状您。那么勒叠,在數(shù)字世界中兜挨,怎么樣進行數(shù)字簽名呢?數(shù)字簽名的步驟如下:
- 選擇合適的摘要算法(如 SHA256)計算出待簽名數(shù)據(jù)的摘要
- 使用私鑰對摘要進行加密眯分,輸出的密文就是數(shù)據(jù)的簽名
對簽名進行檢查的步驟如下:
- 使用公鑰對簽名進行解密拌汇,解密出來的就是數(shù)據(jù)的摘要
- 使用與簽名時相同的摘要算法計算出數(shù)據(jù)的摘要
- 對比步驟 1 和步驟 2 的摘要,如果相同颗搂,則說明簽名有效担猛,否則說明數(shù)據(jù)是無效的
假設(shè)幕垦,有人偷偷篡改了數(shù)據(jù)丢氢,由于數(shù)字簽名是沒辦法改變的,因為數(shù)字簽名是經(jīng)過私密保存的私鑰加密過的先改,別人沒有私鑰疚察,故無法對數(shù)字簽名進行修改。在驗證簽名時仇奶,上述步驟 2 算出來的摘要(被篡改后的數(shù)據(jù)算出來的摘要)和步驟 1 算出來的摘要(用公鑰直接解密的貌嫡,原數(shù)據(jù)的摘要)必定不相同,這樣就可以驗證出來數(shù)據(jù)被人篡改了该溯。
證書簽名
有了數(shù)字簽名的算法岛抄,我們就可以對實體頒發(fā)數(shù)字證書,然后讓有公信力的機構(gòu)對數(shù)字證書進行簽名狈茉,這樣就可以證明實體的真實身份夫椭。數(shù)字證書的主體內(nèi)容包含三部分主要內(nèi)容:
- 證書基本信息:如證書的實體的名稱,郵件地址氯庆,簽發(fā)者蹭秋,有效期等
- 公鑰:通信對端可以從數(shù)字證書里得到公鑰,這樣就可以對私鑰加密過的數(shù)據(jù)進行解密
- 數(shù)字簽名:這個證書的數(shù)字簽名堤撵。簽名就是計算證書的摘要仁讨,然后用簽發(fā)者的私鑰進行加密后的數(shù)據(jù)
老牌的提供數(shù)字簽名服務(wù)的機構(gòu)是 VeriSign,交納一定的費用实昨,VeriSign 可以使用他們的 CA 證書給你的數(shù)字證書進行簽名洞豁。這樣主流的瀏覽器就會認可這個證書,并認為使用了這個證書的網(wǎng)站是安全的荒给。問題是 VeriSign 怎么做到的呢丈挟?
實際上,VeriSign 以他們的信譽背書锐墙,生成了一個根證書礁哄,這個根證書是自簽名的。即 VeriSign 在法律層面上要負責這個根證書的真實性和有效性溪北。萬一哪一天 VeriSign 的根證書的私鑰泄漏了桐绒,被不法分子拿去夺脾,不法分子完全可以使用這個私鑰,給一些惡意網(wǎng)站的證書進行簽名茉继。當用戶打開這些惡意網(wǎng)站時咧叭,瀏覽器就不會提示用戶。相反烁竭,瀏覽器會認為這是一個可信的網(wǎng)站菲茬。
有了根證書,VeriSign 就可以用根證書派撕,按照不同的業(yè)務(wù)和行業(yè)簽發(fā)一堆專用的 CA 證書出來婉弹,然后再用 CA 證書去給具體的實體的數(shù)字證書進行簽名。瀏覽器驗證實體的數(shù)字證書的合法性時终吼,先檢查這個證書的簽名是否正確镀赌,然后檢查給這個證書簽名的 CA 證書的合法性。這樣沿著證書鏈一步步往上驗證际跪,最終驗證到了根證書商佛。由于瀏覽器內(nèi)置了 VeriSign 的根證書,故瀏覽器知道這個證書是合法的姆打。瀏覽器就是這樣判斷一個網(wǎng)站的證書是否是可信的良姆。
比如下圖是招商銀行的證書:
從圖中可以看到,招商銀行的證書是由 Symantec Class 3 EV SSL CA - G3 這個 CA 證書簽名的幔戏,而這個 CA 證書又是由 VeriSign Class 3 Public Primary Certification Authority - G5 這個證書簽名的玛追。這樣也就不難理解,為什么 VeriSign 在給你的網(wǎng)站的數(shù)字證書進行簽名時需要收取費用:實際上這是一個名譽背書的費用评抚。技術(shù)角度來看豹缀,運行一條指令就可以對你的數(shù)字證書進行簽名,沒有任何的成本慨代,但 VeriSign 必須在法律層面保證邢笙,他們簽名的對象是個可信的實體。
實際上侍匙,你完全可以生成一個自簽名的證書氮惯,即用你自己生成的證書的私鑰給你自己的證書簽名。這是完全合法的想暗,但瀏覽器往往不認可這種自簽名證書妇汗,并且提示用戶說,這個網(wǎng)站的證書是不可信的说莫。
實踐出真知
如果你對技術(shù)細節(jié)不感興趣杨箭,這篇文章閱讀到此就可以結(jié)束了。本節(jié)演示如何使用 openssl 工具包储狭,對數(shù)據(jù)進行數(shù)字簽名及驗證互婿,以及對證書進行簽名捣郊。
信息摘要
我們先把要計算摘要的數(shù)據(jù)保存到 data.txt
文件里:
$ echo "This is real words from Joey." > data.txt
然后以這個文件作為輸入計算 SHA256 摘要信息:
$ openssl dgst -sha256 -hex data.txt
其輸出為:
SHA256(data.txt)= f1b1b3f5f35944c8e2169031efac2a37147dac631b8dbd7cfa5d265e0e804e8d
當然,我們也可以換成 MD5 算法并計算其摘要:
$ openssl dgst -md5 -hex data.txt
MD5(data.txt)= ed764086c5770a9d5ff0e60036aa4226
從輸出不難看出慈参,SHA256 的摘要輸出是 32 個字節(jié)(f1 是第一個字節(jié)呛牲,b1 是第二個字節(jié),依此類推)驮配,MD5 的摘要輸出是 16 字節(jié)娘扩。
非對稱加密算法
我們先生成一個 2048 bit 的 RSA 算法私鑰:
$ openssl genrsa -out rsa_private.key 2048
rsa_private.key
就是生成的私鑰。這是個文本文件壮锻,你可以用任何文本編輯器打開它琐旁,內(nèi)容如下:
-----BEGIN RSA PRIVATE KEY-----
BASE64(PRIVATE KEY)
-----END RSA PRIVATE KEY-----
私鑰數(shù)據(jù)是經(jīng)過 BASE64 編碼的數(shù)據(jù),故顯示成 ASCII 字符躯保。私鑰必須私密保存旋膳,一旦泄漏,整個安全體系就崩塌了途事。由于私鑰是如此的重要,openssl 提供了一個方法來加密保存私鑰文件擅羞。下面的命令用來生成密碼保護的密鑰:
$ openssl genrsa -aes256 -passout pass:yourpwd -out rsa_aes_private.key 2048
這個命令生成的私鑰 rsa_aes_private.key
是使用 AES 256 算法加密保存的尸变,密碼就是字符串 yourpwd
。下次使用這個私鑰時减俏,就必須提供這個密碼才能使用召烂。我們還可以把加密保存的私鑰轉(zhuǎn)為不加密的,其命令為:
$ openssl rsa -in rsa_aes_private.key -passin pass:yourpwd -out rsa_private.key
當然娃承,明文的私鑰也可以加密保存起來:
$ openssl rsa -in rsa_private.key -aes256 -passout pass:newpwd -out rsa_aes_private.key
有了私鑰奏夫,我們就可以生成與之配套使用的公鑰:
$ openssl rsa -in rsa_private.key -pubout -out rsa_public.key
rsa_public.key
就是對應(yīng)的公鑰。公鑰文件也是一個純文本文件历筝,其內(nèi)容示意如下:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA69EVk9GKyEQDRfV8OJUf
49eaJ67bTP/zAPm5huf9z7EhAaltjyfHNaCQMYVTAKUAS9c7XhKxA8NkHil/HNBE
4UONY054voisKWYqxtHaoFkcfY5QE+vj9JVJajwYAKZjA362zo2y8qbpJ6INCMeB
19oOuGFBTkn4z0RR71kFriyQ2pOjbHru5pH9bC9t4GjvkNMNWeFdSdR3uO3zIYB6
cl176kaYZ8Bwr+PeGl+jzMpd7lDSEVLLaAt1jZiNLQ1dYTN4GGuURy/6b3d4+TZ1
VxNlLc0+8l+vyzpXRZWxZcEBjA4voeWmxqBKUsA6jKTDS/V6IFOTakoOGLk5w3f1
EQIDAQAB
-----END PUBLIC KEY-----
證書及簽名
生成自簽名證書
使用已有 RSA 算法的私鑰生成自簽名證書:
$ openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt -subj "/C=CN/ST=FJ/L=XM/O=sfox/OU=dev/CN=sfox.com/emailAddress=sfox@sfox.com"
-days 參數(shù)指明這個證書的有效期酗昼;-key 參數(shù)指定使用的 RSA 私鑰文件;-out 參數(shù)指定輸出的自簽名證書文件梳猪,一般以 crt 作為后綴名麻削;-subj 參數(shù)用來指定證書的名稱,如果不帶這個參數(shù)春弥,則需要逐個輸入證書的名稱參數(shù)呛哟,包含國家,省份匿沛,城市扫责,組織名稱,部門名稱逃呼,通用名稱等等鳖孤。
可以使用下面命令來查看自簽名證書的信息:
$ openssl x509 -in cert.crt -noout -text
其輸出示意如下:
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 11926462855904995145 (0xa5834ec7411ba749)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=FJ, L=XIAMEN, O=SFOX, OU=SW, CN=sfox/emailAddress=sfox@qq.com
Validity
Not Before: Mar 31 13:35:11 2018 GMT
Not After : Mar 31 13:35:11 2019 GMT
Subject: C=CN, ST=FJ, L=XIAMEN, O=SFOX, OU=SW, CN=sfox/emailAddress=sfox@qq.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:eb:d1:15:93:d1:8a:c8:44:03:45:f5:7c:38:95:
1f:e3:d7:9a:27:ae:db:4c:ff:f3:00:f9:b9:86:e7:
fd:cf:b1:21:01:a9:6d:8f:27:c7:35:a0:90:31:85:
53:00:a5:00:4b:d7:3b:5e:12:b1:03:c3:64:1e:29:
7f:1c:d0:44:e1:43:8d:63:4e:78:be:88:ac:29:66:
2a:c6:d1:da:a0:59:1c:7d:8e:50:13:eb:e3:f4:95:
49:6a:3c:18:00:a6:63:03:7e:b6:ce:8d:b2:f2:a6:
e9:27:a2:0d:08:c7:81:d7:da:0e:b8:61:41:4e:49:
f8:cf:44:51:ef:59:05:ae:2c:90:da:93:a3:6c:7a:
ee:e6:91:fd:6c:2f:6d:e0:68:ef:90:d3:0d:59:e1:
5d:49:d4:77:b8:ed:f3:21:80:7a:72:5d:7b:ea:46:
98:67:c0:70:af:e3:de:1a:5f:a3:cc:ca:5d:ee:50:
d2:11:52:cb:68:0b:75:8d:98:8d:2d:0d:5d:61:33:
78:18:6b:94:47:2f:fa:6f:77:78:f9:36:75:57:13:
65:2d:cd:3e:f2:5f:af:cb:3a:57:45:95:b1:65:c1:
01:8c:0e:2f:a1:e5:a6:c6:a0:4a:52:c0:3a:8c:a4:
c3:4b:f5:7a:20:53:93:6a:4a:0e:18:b9:39:c3:77:
f5:11
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
b3:41:be:6f:54:3c:d7:fc:53:c6:21:f5:ea:fa:2d:c7:70:ed:
29:57:c4:0b:74:43:74:24:1b:05:df:2e:9f:ef:76:32:8a:8e:
4a:85:31:18:a2:50:95:1a:6e:07:cf:e9:82:04:55:ee:1b:26:
0a:e7:bf:47:ef:d5:69:d1:ef:fb:db:50:52:84:2d:85:e9:2c:
15:5c:de:2d:9c:74:fe:90:b9:02:29:1b:dc:fb:b8:ef:08:b2:
04:0c:27:66:c8:f1:31:a6:f3:52:73:4b:16:41:0d:f1:a9:d5:
f2:1b:60:3a:44:a0:be:35:ef:a6:e4:10:bf:90:4e:98:3f:56:
3e:3d:ef:99:b2:38:97:2b:5a:f9:46:61:4a:e1:77:9e:76:0a:
3a:d6:2f:f2:16:31:8c:cf:e5:e4:e5:42:14:07:8c:fa:a6:48:
19:76:cd:6d:63:8e:62:a2:65:83:9f:9d:c4:d6:32:97:6a:54:
e6:27:49:30:aa:08:72:0c:2f:e0:9a:a1:ae:2a:75:34:ad:31:
0f:26:71:7e:6f:75:d4:cc:d3:58:13:2c:18:da:2d:ef:a1:e6:
7a:9a:d1:d4:1d:48:b4:ac:06:84:8b:07:1b:15:9c:f8:e5:fe:
ac:58:c4:50:74:a9:8e:c2:f9:24:01:a2:d1:83:92:41:96:fa:
bb:42:73:7a
生成簽名請求文件
當需要申請使用 CA 證書對證書進行簽名時借帘,需要生成簽名請求文件。使用己有的 RSA 私鑰生成簽名請求文件的命令為:
$ openssl req -new -key rsa_private.key -out cert.csr -subj "/C=CN/ST=FJ/L=XM/O=sfox/OU=dev/CN=sfox.com/emailAddress=sfox@sfox.com
其中 -key 指定證書的私鑰信息淌铐,openssl 命令會使用私鑰來算出公鑰肺然,并把公鑰包含在證書文件里;-out 指明要生成的證書簽名請求文件的文件名腿准,一般以 csr 作為后綴际起;-subj 表示待簽名的證書的名稱信息。生成的證書請求文件可以使用如下命令來查看詳情:
$ openssl req -noout -text -in cert.csr
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=CN, ST=FJ, L=XM, O=SFOX, OU=SW, CN=sfox.com/emailAddress=sfox@qq.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:eb:d1:15:93:d1:8a:c8:44:03:45:f5:7c:38:95:
1f:e3:d7:9a:27:ae:db:4c:ff:f3:00:f9:b9:86:e7:
fd:cf:b1:21:01:a9:6d:8f:27:c7:35:a0:90:31:85:
53:00:a5:00:4b:d7:3b:5e:12:b1:03:c3:64:1e:29:
7f:1c:d0:44:e1:43:8d:63:4e:78:be:88:ac:29:66:
2a:c6:d1:da:a0:59:1c:7d:8e:50:13:eb:e3:f4:95:
49:6a:3c:18:00:a6:63:03:7e:b6:ce:8d:b2:f2:a6:
e9:27:a2:0d:08:c7:81:d7:da:0e:b8:61:41:4e:49:
f8:cf:44:51:ef:59:05:ae:2c:90:da:93:a3:6c:7a:
ee:e6:91:fd:6c:2f:6d:e0:68:ef:90:d3:0d:59:e1:
5d:49:d4:77:b8:ed:f3:21:80:7a:72:5d:7b:ea:46:
98:67:c0:70:af:e3:de:1a:5f:a3:cc:ca:5d:ee:50:
d2:11:52:cb:68:0b:75:8d:98:8d:2d:0d:5d:61:33:
78:18:6b:94:47:2f:fa:6f:77:78:f9:36:75:57:13:
65:2d:cd:3e:f2:5f:af:cb:3a:57:45:95:b1:65:c1:
01:8c:0e:2f:a1:e5:a6:c6:a0:4a:52:c0:3a:8c:a4:
c3:4b:f5:7a:20:53:93:6a:4a:0e:18:b9:39:c3:77:
f5:11
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
13:aa:fc:0f:82:a4:b1:cf:3a:f3:3f:ff:53:b8:50:e8:41:cc:
6b:a3:1c:5b:e2:4d:b0:47:f3:02:a8:ae:34:22:94:fc:8d:6b:
11:41:82:33:9f:b1:df:da:fd:90:18:55:5d:aa:9e:61:82:26:
e0:b5:9e:86:0d:18:cb:8d:e4:f5:d3:2c:32:8d:21:9d:f8:c2:
3d:c8:22:e2:9c:10:69:bc:25:de:a4:14:05:c3:2c:c7:7b:d4:
ee:30:53:9c:71:2f:0e:f5:04:83:54:d8:74:28:e9:ef:4a:72:
b5:88:a5:73:d5:78:8e:27:88:be:52:16:fd:a9:cc:13:38:aa:
1c:94:a4:20:a5:23:4d:bd:7d:29:d2:db:da:ec:86:2c:99:36:
fb:c0:b2:0f:ec:da:ef:51:d5:f7:37:d0:11:59:d0:66:c4:e9:
d1:ed:a1:2b:d4:b3:46:6b:fe:6f:17:3b:77:0c:be:f8:20:5b:
ca:66:2d:64:17:20:5d:19:73:4d:be:5e:e3:fc:25:1a:cb:03:
87:4d:55:7a:56:9d:ed:d7:7d:5a:55:e2:85:1b:2f:d2:fe:74:
43:6f:84:5c:2b:de:c9:0c:05:76:08:65:de:6a:21:d6:26:0f:
23:5a:12:4e:13:0e:8f:fd:ef:7c:e6:b4:6b:07:80:0f:2b:b8:
7f:66:c7:16
細心的讀者可以發(fā)現(xiàn)吐葱,證書簽名請求文件和自簽名的證書文件相比街望,少了 Issuer(頒發(fā)者),Serial Number弟跑,Validity(有效期)等信息灾前。
使用 CA 證書對 CSR 文件進行簽名
要使用 CA 證書對簽名請求文件進行簽名,你必須有 CA 證書文件以及 CA 證書的私鑰文件孟辑。有了這兩個文件哎甲,可以使用下面的命令進行簽名:
$ openssl x509 -req -days 3650 -in cert.csr -CA ca.crt -CAkey ca.key -passin pass:yourpwd -CAcreateserial -out cert_ca_signed.crt
-days 表示證書的有效期,此處指定 3650 表示 10 年有效期饲嗽;-in 表示輸入文件炭玫,此處是指證書請求簽名文件的文件名;-CA 指定 CA 證書的文件名貌虾;-CAkey 指定 CA 證書的私鑰文件吞加;-passin 指定 CA 證書的私鑰文件的加密密碼,如果以明文保存的私鑰文件尽狠,則此參數(shù)可省略衔憨。-CAcreateserial 參數(shù)指定給簽名后的證書創(chuàng)建序列號;-out 參數(shù)指明輸出的簽名后的數(shù)字證書文件的文件名袄膏。
當然践图,這里你完全可以使用自簽名的證書文件及其對應(yīng)的私鑰文件給其他的證書請求文件進行簽名。
數(shù)字簽名及驗證
本小節(jié)將演示對一段文本內(nèi)容進行簽名哩陕,然后驗證簽名的正確性平项。
我們先生成待簽名的數(shù)字內(nèi)容:
$ echo "This is real words from Joey." > data.txt
接著,對數(shù)字內(nèi)容進行簽名悍及,簽名的時候使用的是私鑰:
$ openssl dgst -sha256 -sign rsa_private.key -out data.sign data.txt
這個命令對 data.txt
文件的內(nèi)容計算 SHA256 摘要闽瓢;然后使用對輸出的 32 字節(jié)的摘要信息,使用 rsa_private.key
指定的私鑰進行加密心赶,并把密文輸出到 data.sign
文件里扣讼。data.sign
是個二進制文件,文件里保存的內(nèi)容就是 data.txt
文件的數(shù)字簽名缨叫。
接著椭符,我們對數(shù)字內(nèi)容進行簽名檢查荔燎,檢查簽名時使用的是公鑰:
$ openssl dgst -sha256 -verify rsa_public.key -signature data.sign data.txt
不出意外的話,輸出的內(nèi)容為:
Verified OK
表示數(shù)字簽名驗證成功销钝,data.txt
文件的內(nèi)容沒有被篡改∮凶桑現(xiàn)在,我們把 data.txt
文件修改一下蒸健,看看簽名驗證能否成功:
$ echo "This is fake words from Joey." > data.txt
$ openssl dgst -sha256 -verify rsa_public.key -signature data.sign data.txt
Verification Failure
此時輸出的是 Verification Failure
表示數(shù)字簽名驗證失敗座享。
當然,如果我們手頭沒有現(xiàn)成的公鑰業(yè)驗證簽名似忧,只要有這個網(wǎng)站的證書渣叛,則可以可以從證書里獲取到公鑰:
openssl x509 -in cert_ca_signed.crt -pubkey -noout > rsa_public.key
(完)