非對稱加密(一句話概括)
給你一把打開的鎖,用它鎖住重要的東西寄回給我,鑰匙我自己留著誰也不給。
鎖=公鑰;鑰匙=私鑰
公鑰就是下面這東西
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8sBFht3URDLrQrJ/CCUe3zrIJ
QPYJuBUMfnXV11aV38NEFvzr2I89MAsv7PBl0yEusAhsoOssZuaqRpUatMoScqy8
Ap0c0yAD3OY2SjFeqWdn7p2qjRjBLjVwGwA5gRDaX34Yo/r8fGq9WwDPQTkya5pa
VkyiyROU9q/q8XppGQIDAQAB
-----END PUBLIC KEY-----
私鑰就是這東西
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALywEWG3dREMutCs
n8IJR7fOsglA9gm4FQx+ddXXVpXfw0QW/OvYjz0wCy/s8GXTIS6wCGyg6yxm5qpG
lRq0yhJyrLwCnRzTIAPc5jZKMV6pZ2funaqNGMEuNXAbADmBENpffhij+vx8ar1b
AM9BOTJrmlpWTKLJE5T2r+rxemkZAgMBAAECgYAfAUuJ5Ax/hbj46zTBPKclQ/ir
XppPVIlY6TrRrbXToNZETQa4dnhrFIbyFBwYj03njxODThn2zN3gYwLDRavifal7
t07LvE7fwv84QCB4V0/v3WDDex+jCd3HjikiDG48ugC5uZk2Zmz+6DVHTfisr/Ia
TFaZwnar1Fx2IIY50QJBAO9SdP68hUuk8OROjQixbK3AT0ANVCf4lig6eC/yyWzY
IpMda+lwFrcA2Zm4P5lTl4czpH6axKZGlqiUJPkS5K0CQQDJ1klfn/R5m3Mnx7jd
o/jt+izVP+WHTpEoz4DYkLmp2+6umrt1pymTyszJVnSfB8wV2hHablROAgWH8E5+
LzedAkEAoadk95yHvSzQuqaEhVazPjokTfOy4Lz9UHcOL/UjMa5czFqXRbs83Khq
U3ctHnhkZiLv/cS1CEuuAHjw8H1ekQJAeo+49mw3FDEk+B77TvtnCXtFBilKw6Md
2l5GqzsWwuJeSYCEHKlpQel/+TKalocxkoNdG/qrDsODgEyYHV+msQJAPJdy7pwM
C8IYR8yOGr79R4lK85u1q6bGbZGuqBfnUb7GfuEDIwTgn7wFzFybp/sCzwlSXwpj
vp+SsYi+oAgQmQ==
-----END PRIVATE KEY-----
具體指的是加、解密使用不同的密鑰,一把作為公開的公鑰,另一把作為私人保留的私鑰。公鑰加密的信息,只有私鑰才能解密。反之,私鑰加密的信息,只有公鑰才能解密。
再舉個例子,你向某公司伺服器請求公鑰,伺服器將公鑰發給你,你使用公鑰對消息加密,那麼只有私鑰的持有人才能對你的消息解密。
與對稱加密不同的是(指的是加解密使用同一串密鑰,常見的對稱加密算法有:DES、AES等。),公司伺服器不需要將私鑰通過網絡發送出去,因此安全性大大提高。
最常用的非對稱加密算法:RSA(RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。)
那麼有了一些概念後,我們來代入,加密過程是怎麼樣?解密過程是怎麼樣?
先介紹個軟體,GPG(一款免費軟體,由自由軟體基金會開發,全稱:GnuPG)。
重要功能命令有:
gpg --gen-key
#生成自己的密鑰,需設定長度(長度越長越安全)、有效期、用戶標識(姓名、郵件、注釋)、私鑰密碼(防止系統入侵,或非法使用私鑰,相當於給私鑰在加層保護)
生成後,系統會提示:
gpg: 密鑰 EDDD6D76 被標記為絕對信任 公鑰和私鑰已經生成並經籤名。
請注意上面的字符串"EDDD6D76",這是"用戶ID"的Hash字符串,可以用來替代"用戶ID"。
這時,最好再生成一張"撤銷證書",以備以後密鑰作廢時,可以請求外部的公鑰伺服器撤銷你的公鑰。
gpg --gen-revoke[用戶ID]
#生成撤銷證書,防止以後密鑰需要作廢,可以使用該撤銷證書撤銷公鑰。
gpg --import test.key
#撤銷本地證書
gpg -send-keys[ID]
#將被撤銷的公鑰ID發送到CA,即可撤銷伺服器上的公鑰。
gpg --send-keys [用戶ID] --keyserver hkp://subkeys.pgp.net
#上傳公鑰至對應密鑰管理伺服器(可以是公網託管伺服器也可以是自己布署的私有CA)
gpg --recipient [用戶ID] --output demo.en.txt --encrypt demo.txt
#recipient後跟著接收者的公鑰,即此文件接收方。
gpg --decrypt demo.en.txt --output demo.de.txt
#接收者收到後,即可解密。
gpg --sign demo.txt
#有時不需要加密,只需要證明該文件由我發出,就需要用到籤名
運行上面的命令後,當前目錄下生成demo.txt.gpg文件,這就是籤名後的文件。這個文件默認採用二進位儲存,如果想生成ASCII碼的籤名文件,可以使用clearsign參數。
gpg --local-user [發信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt
#籤名+加密
local-user參數指定用發信者的私鑰籤名,recipient參數指定用接收者的公鑰加密,armor參數表示採用ASCII碼形式顯示,sign參數表示需要籤名,encrypt參數表示指定源文件。
gpg --verify demo.txt.asc demo.txt
#收到籤名文件後,可以使用對方公鑰來驗證,參數為verify
了解底層生成方法後,我們來看看數字證書和數字籤名的關係。
可視化的數字證書長這樣
可以看到頒發者為:DigiCert Global Root CA,頒發給了自己,有效期為25年,如同上面說提到的GPG命令一樣,設置了有效期、算法、長度等信息。
PS:除了GPG,還有其他開源工具,如OpenSSL,也可以生成證書。
如何生成?
生成要區分公網和私網環境,如果需要發布到公網就需要向對應的可信任CA機構申請,這樣你申請的證書才會在公網上被認可,私網可以自己搭建CA,比如GPG或OpenSSL等開源工具部署,最後手動添加信任即可。
作用?
可以用於網頁傳輸、電子郵件傳輸、軟體安裝包等,確保數據交互時,不會被竊聽或篡改。
可視化數字籤名長這樣
軟體安裝包一般都會有證書內嵌,如果沒有籤名的話一安裝就會提示這樣:
這是因為該軟體沒有內籤,所以Microsoft會有安全提示,當然你可以直接運行,但是該安裝包因為沒有權威機構籤名,所以可能有未知風險。
另外在此路徑可以查看到系統所有受信任的根證書頒發機構,當然你也可以手動添加。(註:根證書所籤發的所有證書均默認被信任,所以自己添加根證書請謹慎。)
程序怎麼籤名?
以微軟系統舉例,使用SignCode.exe,根據步驟,將公、私鑰導入,選擇加密算法、時間戳等,即可將安裝包進行籤名。
那如果是文件籤名的話,請參照上方GPG命令,籤名過程是這樣的:
A:發送文件B用戶,確保由A發送
A:將文件Hash後,得到概要(固定長度)
A:將概要使用私鑰加密
A:將加密後的概要、原文件、公鑰三者發送 給B用戶
B:收到原文件,使用相同Hash算法後得到概要
B:使用A的公鑰解密加密後的概要
B:比對概要,無差別即為A籤名的文件。
作用?
確保文件或軟體、數據由對應籤名者發送,未被篡改。
以上。
最後:
個人的學習見解,希望有技術大佬可以多多指正。