目錄
常用術(shù)語:
加密:encryption 解密:decryption
秘鑰:secret key (公鑰:public key 私鑰:private key)
數(shù)字簽名:digital signature
數(shù)字證書:digital certificate
摘要:digest
可以參考的文章:What is a Digital Signature? (翻譯:數(shù)字簽名是什么?)
Base64也不是加密解密算法,只能算是一個編碼算法,通常用于把二進制數(shù)據(jù)編碼為可寫的字符形式的數(shù)據(jù),對數(shù)據(jù)內(nèi)容進行編碼來適合傳輸(可以對img圖像編碼用于傳輸)。這是一種可逆的編碼方式。
更多Base64相關(guān)知識可參考博客:base64
這64個字符為:
a-z(26個)、A-Z(26個)、0-9(10個)、 和 / (2個),共64個。
常見的散列算法有MD5、SHA1、HMAC。散列算法并不是加密算法。
密碼通常用md5算法加密,雖然不能通過逆向的方式恢復成明文,但是卻可以通過碰撞的方式得到原密碼或者替代密碼。
(簡單具體例子,假設密碼是數(shù)字2,而hash算法是對原數(shù)字進行平方運算,2的平方為4,實際上我們不需要也不可能通過逆向得到原密碼2,但只需要找到其替代值-2就足以。)
md5加鹽
鹽,是一串比較復雜的字符串。加鹽的目的是加強加密的復雜度,當然這個“鹽”越長越復雜,加密后破解起來就越麻煩。加鹽并不表示就安全了,“鹽”也可能被泄漏出去。
另外,加鹽也不一定加固定的鹽。
SHA-1密碼算法,由美國專門制定密碼算法的標準機構(gòu)———美國國家標準技術(shù)研究院與美國國家安全局設計,早在1994年就被推薦給美國政府和金融系統(tǒng)采用,是美國政府目前應用最廣泛的密碼算法。
散列消息鑒別碼,基于密鑰的Hash算法的認證協(xié)議。
補充:王小云和她的研究小組已經(jīng)宣布,成功破解MD5和SHA-1等加密算法。實際上并不是真正意義上的破解,只是提高了碰撞效率。
對稱加密就是通信雙方使用相同的秘鑰加密解密。
對稱加密算法有DES、3DES(TripleDES),DESede、AES、Blowfish,以及RC2和RC4算法,還有其他第三方提供的軟件包提供的Bouncy Castle 提供的IDEA算法。
這里面DES算是最經(jīng)典的算法,DESede是DES算法的變種,AES算是DES算法的替代者;
AES(Advanced Encryption Standard)
AES翻譯過來是高級加密標準,它是用來替代之前的DES加密算法的。但是因為AES加密算法的安全性要高于DES和3DES,所以AES已經(jīng)成為了主要的對稱加密算法。
更多對稱加密算法的知識可參考博客:對稱加密及AES加密算法
非對稱加密使用一對密鑰:公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發(fā)給任何請求它的人。
公鑰和私鑰是成對出現(xiàn)的,它們可以互相解密。公鑰加密的內(nèi)容,只有私鑰可以解密。私鑰加密的內(nèi)容,只有公鑰可以解密。
(公鑰加密私鑰解,私鑰簽名公鑰驗證。 )
主要的非對稱加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)。
使用最廣泛的是RSA算法,Elgamal是另一種常用的非對稱加密算法
截取一段內(nèi)容,來自對稱加密及AES加密算法
非對稱加密算法的效率是非常低的。
將內(nèi)容使用hash函數(shù)生成摘要,再用私鑰對摘要進行加密,生成數(shù)字簽名。然后將內(nèi)容附上數(shù)字簽名一同傳輸。
收件方收到后,用公鑰對數(shù)字簽名進行解密,得到摘要,然后再對原內(nèi)容進行hash生成摘要,比對這兩個摘要是否相同,相同則說明內(nèi)容沒有被篡改。
由CA頒發(fā)給網(wǎng)站的身份證書,里面包含了該網(wǎng)站的公鑰,有效時間,網(wǎng)站的地址,CA的數(shù)字簽名等。
所謂的CA數(shù)字簽名,實際上就是使用了CA的私鑰將網(wǎng)站的公鑰等信息進行了簽名,當客戶端請求服務器的時候,網(wǎng)站會把證書發(fā)給客戶端,客戶端首先可以通過CA的數(shù)字簽名校驗CA的身份,也能證明證書的真實完整性。客戶端有沒有可能到一個假冒的CA去校驗數(shù)字證書呢?不太可能,因為CA的地址是內(nèi)嵌在瀏覽器中的,很難被篡改。
keytool和openssl都是證書管理工具。openssl和keytool的區(qū)別可以參考數(shù)字證書管理工具openssl和keytool的區(qū)別
keytool是Java自帶的數(shù)字證書管理工具,用于數(shù)字證書的生成,導入,導出與撤銷等操作。它與本地密鑰庫關(guān)聯(lián),并可以對本地密鑰庫進行管理,可以將私鑰存放于密鑰庫中,而公鑰使用數(shù)字證書進行輸出。keytool位于jdk安裝目錄的bin文件夾下。
openssl官網(wǎng)地址:https://www.openssl.org/
待補充:使用keytool和openssl生成自簽名證書步驟
總結(jié):
對稱加密與解密使用的是相同的密鑰,所以速度快,但由于需要將密鑰在網(wǎng)絡傳輸,所以安全性不高。
非對稱加密使用了一對密鑰:公鑰與私鑰,所以安全性高,但加密與解密速度慢。
通常的辦法是將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然后發(fā)送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然后雙方仍然可以使用對稱加密來進行溝通。