![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iNxQDMyQWN5QGOhFDNygjMzYzX2ATMxYTM5EzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
在之前的文章中,我們講到了對稱密碼,公鑰密碼,消息認證碼和數字簽名等密碼學的技術,這些技術中都使用到了一個叫做密鑰的東西。
那麼到底什麼是密鑰呢?密鑰就是一個key,通過這個key可以獲得最終的明文。是以密鑰其實是和明文等價的。
舉個例子,保險箱裡面放着十萬美元,保險箱被鎖住了,并且有一個鑰匙。那麼這個擁有鑰匙的人和擁有了十萬美元是等價的
目錄
- 各種密鑰總結
- 其他密鑰分類
- 密鑰的管理
在之前的文章中,我們講到了對稱密碼,公鑰密碼,消息認證碼和數字簽名等密碼學的技術,這些技術中都使用到了一個叫做密鑰的東西。
那麼到底什麼是密鑰呢?密鑰就是一個key,通過這個key可以獲得最終的明文。是以密鑰其實是和明文等價的。
舉個例子,保險箱裡面放着十萬美元,保險箱被鎖住了,并且有一個鑰匙。那麼這個擁有鑰匙的人和擁有了十萬美元是等價的。
各種密鑰總結
之前的文章中,我們分别講到了對稱密碼,公鑰密碼,消息認證碼和數字簽名這四種密碼學技術。這裡我們再來回顧一下。
- 對稱密碼
對稱密碼使用相同的密鑰來進行明文的加密和解密。
- 公鑰密碼
公鑰密碼使用不同的密鑰來對消息進行加密解密。
- 消息認證碼
消息認證碼使用相同的密鑰來對消息進行認證。
- 數字簽名
數字簽名使用不同的密鑰來對消息進行簽名和驗證。
其中對稱密碼和公鑰密碼是直接對明文進行加密,進而用來保證消息的機密性。
而消息認證碼和數字簽名則是用來做消息的認證,其本身并不用作對明文的加密,主要來驗證消息的合法性。
其他密鑰分類
上面的四種是按照加密方式和使用用途來分的,其實安裝密鑰的使用次數可以分為會話密鑰和主密鑰。
會話密鑰是隻用在一個會話中的密鑰,用完之後就廢棄不用了,而主密鑰是固定的密鑰,一直重複使用的密鑰。
熟悉SSL/TLS協定的朋友肯定對這個比較熟悉,在這個協定中每次會話都會建立一個單獨的密鑰用來加密會話消息,也就是說每次會話都會建立一個會話密鑰。
另外安裝加密對象是内容還是密鑰,我們可以分為加密消息的密鑰(CEK)和加密密鑰的密鑰(KEK)。加密消息的密鑰很好了解,之前的對稱密鑰和公鑰密鑰就是CEK。而加密密鑰的密鑰主要是為了減少密鑰的儲存個數。
密鑰的管理
我們主要從下面幾個方面來講解密鑰的管理:
- 生成密鑰
生成密鑰有兩種方式,使用随機數和使用密碼。
随機數一定要有不可被推斷的特性,一般來說我們需要使用僞随機送生成器來生成。
java代碼中我們通常會用到Random類,但是這個類是不能用來生成密鑰的。我們可以使用java.security.SecureRandom來生成密碼安全的随機數。
下面是SecureRandom的兩種常用用法:
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
byte seed[] = random.generateSeed(20);
除了随機數,另外一種方式就是密碼了。
密碼是人類可以記住的密碼,為了保證密碼生成的密鑰不會被暴力破解,需要對密碼加鹽。
簡單點說就是向密碼添加一個随機數,然後對添加之後的數進行hash計算,計算出來的結果就可以當做密鑰了。
- 配送密鑰
為了配送密鑰我們可以采用事先共享密鑰,使用密鑰配置設定中心,使用公鑰密碼等方式。當然還可以采用其他的方式來配送。
- 更新密鑰
有的時候,為了保證密鑰的安全,我們需要不定期的更新密鑰,一般的做法就是使用目前的密鑰作為一個基準值,通過特定的算法計算出新的密鑰。
- 儲存密鑰
學過區塊鍊的應該都知道有個紙密鑰的東西,實際上就是把密鑰寫在紙上進行儲存。
當密鑰太多的話,離線儲存密鑰也成了一個非常困難的工作。這時候就可以使用到密鑰的密鑰KEK。将這些密鑰加密後儲存。
這樣加密後的密鑰我們不用特别考慮其安全性,因為即使被竊取也無法還原之前的密鑰。我們隻需要儲存加密這些密鑰的密鑰即可。
- 廢棄密鑰
廢棄密鑰是個非常比較複雜的事情,因為密鑰就是密鑰,即使你把它删除,其他的人也可能持有它的備份。是以在設計的時候要充分考慮到密鑰廢棄的情況。
之前的證書一文中,我們可以通過CRL清單來儲存廢棄的密鑰。