前陣子看了HBO重播的「模仿遊戲」,除了真人真事,劇情精彩外,
身為專業的IT人員(咦?)一直覺得密碼學是天才級的學問,
因為以前大學修的如「資訊隱藏」、「演算法」這種課程完全都是低空飛過,可見得我完全沒有這方面的天分。
這幾天,剛好工作要實作登入功能,所以順便來稍微研究一下加解密的技術,順便整理一下,算是做個筆記。
- Encryption
- 為可逆,意思是加密後可以進行解密,訊息大小不變。
- 常被用來做為基於金鑰的資料加解密(如,AES、RSA、ECC)
- Hash
- 為不可逆,亦為加密後無法進行解密,轉為HASH後訊息量變小。
- Hash主要被用來做數位簽章、資料校驗(如,CRC、SHA、MD5)
加解密演算法分為對稱(Symmetric)、非對稱(Asymmetry)兩大類
- 對稱(Symmetric)加密
- 對稱加密是最古老的一種加密方式。其核心特點在於加密、解密的金鑰是一樣的(或可以互相通過演算法變換的)。這種演算法很容易理解,就是一把鑰匙既能加鎖也能開鎖。幾種常見的對稱加密演算法
- 凱撒密碼
- 例如把一本小說裡的 a 替換成 b 、b 替換成 c、c 替換成 d,或者根據一個映射表進行替換。
- AES(Advanced
Encryption Standard)推薦使用
- 這個演算法久經考驗,運算速度在對稱加密中能排到前三,,廣泛應用於各種加密軟體、硬體,常用的block大小有128bytes、256bytes。
- 非對稱加密演算法:
- 為加解密的金鑰各分為兩組,彼此不能反推,意為用key1加密後的密碼,只能用key2解開
- 常用有兩種演算法
- 因數分解演算法
- RSA、DSA為其代表,Linux系統的SSH就是基於這兩種演算法進行檔key
auth,前幾年一般建議RSA至少要達到1024位金鑰才能保證抵禦暴力破解,但由於GPU和超級電腦的算力提升,現在金鑰長度建議2048位了。
- RSA加密的速度大致是AES的1/30左右
- 橢圓曲線演算法(ECC)
- 可以用1/6的金鑰長度達到比RSA更高的強度,代表演算法有ECC、SM2等
實作登入驗證帳密,則建議應該使用單向不可逆的加密方式(看網路der),用明碼加鹽後,轉成HASH加密與DB的加密字串進行比對。而若使用者忘記密碼,只能使用重設密碼的方式讓使用者再重新登入後進行修改。
主要實作片斷
主要實作片斷
PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes);
SecretKeyFactory skf = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);
return skf.generateSecret(spec).getEncoded();
SecretKeyFactory skf = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);
return skf.generateSecret(spec).getEncoded();
沒有留言:
張貼留言