先說說AES:
這里有一篇文章比較專業(yè),但對我來說太難了
學(xué)霸這邊請
雖然看不太明白晶默,但是有幾個概念還得稍微了解一下下的:
- 密鑰長度
AES的密鑰長度炬守,不是隨意的眠菇。必須是128位毁枯,192位慈缔,256位中的一種。
128位性能最好种玛,256位更安全藐鹤;
- 填充
AES是分組加密的,它會把你的明文分成128bit的"塊"赂韵。問題是娱节,如果待加密的明文長度不是128bit的整數(shù)倍的話,剩下最后的一塊就需要“填充”祭示,湊夠128bit肄满。填充通常有3種模式:
- NoPadding : 顧名思義,不填充质涛。 也就意味著稠歉,你需要自己保證你的明文是128bit的整數(shù)倍。一般明文都不符合這個要求的蹂窖, 這個選項基本沒有用武之地轧抗。
- PKCS5Padding : 這個是默認選項,比較符合人性瞬测。在明文塊末尾補足相應(yīng)數(shù)量的字符,且每個字節(jié)的值等于缺少的字符數(shù)纠炮。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個字節(jié)月趟,則補全為{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
- ISO10126Padding : 如果明文塊少于16個字節(jié)(128bit),在明文塊末尾補足相應(yīng)數(shù)量的字節(jié)恢口,最后一個字符值等于缺少的字符數(shù)孝宗,其他字符填充隨機數(shù)。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個字節(jié)耕肩,則可能補全為{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
第二種和第三種因妇,都是可以的,只要跟解密方約定一致即可猿诸。
我們就選 PKCS5Padding吧
- 模式
- ECB
ECB模式是最簡單直接的婚被,把明文分組,每組分別加密梳虽。因為每組的加密都互不影響址芯,所以能夠并行計算。但是缺點是安全性略差。 - CBC
CBC在實際中用的多一點谷炸。對第一塊明文加密后北专,加密的結(jié)果(第一塊的密文)又會參與下一個塊的的加密(是不是跟區(qū)塊鏈有點像?)旬陡⊥赝牵可想而知,這種加密模式肯定是個串行的描孟。但是安全性高录粱,只要其中一個塊被篡改了,其后所有的塊都不正確(確實跟區(qū)塊鏈有點像)画拾。
還有CFB和OFB兩種模式啥繁,沒有實際用過,這里就不瞎寫了青抛。
我們試試CBC模式吧
- 初始化向量 (IV)
模式中提到的 CBC旗闽,CFB,OFB蜜另,都需要提供一個值IV适室。我對這個值的理解是:
如果你用一個明文ABC和密鑰xyz總是能生成一個密文 DEF,那么別人看到DEF举瑰,就會猜到你的明文是ABC捣辆。
這里再加上一個初始化向量,生成的密文會是另外的一個值此迅。這樣就大大增加了猜測的難度汽畴。
我們提供的這個IV,只會在加密第一個塊時用到耸序;其他塊會自動生成忍些;
對于我們來說,IV設(shè)定一個固定值坎怪,加密解密端一致保持就可以了罢坝。
以上是關(guān)于AES加密的一些介紹。但是事情還沒完搅窿。
上邊提到了 "密鑰"嘁酿。在實際開發(fā)中,為了做的更安全一點男应,我們并不一定會直接給AES一個密鑰闹司,我們只會給一個"口令"。
他們有什么區(qū)別呢?
口令一般是給"人"用的殉了】觯基本上跟我們說的“密碼”是一個概念。我們通常會選用一個單詞或者數(shù)字,來幫助我們記憶众弓。比如 “passw0rd”就是一個口令恩溅。但是對于計算機來說,如果直接用口令來當成密鑰谓娃,通常會有安全隱患苗傅。太容易被人通過窮舉温圆、猜測的方式進行破解;另外,長度也是一個問題因妙,長度不同渤愁,安全性是不一樣的缰揪。因此眨业,我們得的口令一般不會直接做為密鑰,而是根據(jù)口令通過算法生成一個符合要求的密鑰画株。
這個密鑰生成算法辆飘,可以看一下 PBKDF2WithHmacSHA1。這個算法大部分的語言都實現(xiàn)了谓传,調(diào)用方便蜈项,還可以指定生成的密鑰長度(這個好,AES的密鑰就有長度的要求)续挟。
這里就不重復(fù)介紹了紧卒,只是簡單說一下我們需要用到的變量。
- 鹽 (salt): 一個字符串诗祸,需要加密解密兩方約定跑芳。
- 迭代次數(shù): 整數(shù)值, 個人覺的不用太大贬媒。 而且前端這個值如果太大的話聋亡,感覺對速度影響比較大。我自己的項目里邊這個值設(shè)定<100
基本就這些了际乘。下一節(jié)開始寫代碼。