2016年1月1日 星期五

加密演算法略分

前陣子看了HBO重播的「模仿遊戲」,除了真人真事,劇情精彩外,
身為專業的IT人員(咦?)一直覺得密碼學是天才級的學問,
因為以前大學修的如「資訊隱藏」、「演算法」這種課程完全都是低空飛過,可見得我完全沒有這方面的天分。
這幾天,剛好工作要實作登入功能,所以順便來稍微研究一下加解密的技術,順便整理一下,算是做個筆記。


EncryptionHash算法哪裡不同?
  • Encryption
    • 為可逆,意思是加密後可以進行解密,訊息大小不變。
    • 常被用來做為基於金鑰的資料加解密(如,AESRSAECC
  • Hash
    • 為不可逆,亦為加密後無法進行解密,轉為HASH後訊息量變小。
    • Hash主要被用來做數位簽章、資料校驗(如,CRCSHAMD5
加解密演算法分為對稱(Symmetric)、非對稱(Asymmetry)兩大類
  • 對稱(Symmetric)加密
    • 對稱加密是最古老的一種加密方式。其核心特點在於加密、解密的金鑰是一樣的(或可以互相通過演算法變換的)。這種演算法很容易理解,就是一把鑰匙既能加鎖也能開鎖。幾種常見的對稱加密演算法
      • 凱撒密碼
        • 例如把一本小說裡的 a 替換成 b 替換成 c替換成 d,或者根據一個映射表進行替換。
      • AESAdvanced Encryption Standard)推薦使用
        • 這個演算法久經考驗,運算速度在對稱加密中能排到前三,,廣泛應用於各種加密軟體、硬體,常用的block大小有128bytes256bytes
  • 非對稱加密演算法:
    • 為加解密的金鑰各分為兩組,彼此不能反推,意為用key1加密後的密碼,只能用key2解開
    • 常用有兩種演算法
      • 因數分解演算法
        • RSADSA為其代表,Linux系統的SSH就是基於這兩種演算法進行檔key auth,前幾年一般建議RSA至少要達到1024位金鑰才能保證抵禦暴力破解,但由於GPU和超級電腦的算力提升,現在金鑰長度建議2048位了。
        • RSA加密的速度大致是AES1/30左右
      • 橢圓曲線演算法(ECC
        • 可以用1/6的金鑰長度達到比RSA更高的強度,代表演算法有ECCSM2
實作登入驗證帳密,則建議應該使用單向不可逆的加密方式(看網路der),用明碼加鹽後,轉成HASH加密與DB的加密字串進行比對。而若使用者忘記密碼,只能使用重設密碼的方式讓使用者再重新登入後進行修改。

主要實作片斷
PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes);
SecretKeyFactory skf = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);
return skf.generateSecret(spec).getEncoded();


沒有留言:

張貼留言