天天看點

加解密與編解碼算法A).  Base64B).  DESC).  MD5D).HASH

base64編碼的思想是是采用64個基本的ascii碼字元對資料進行重新編碼。它将需要編碼的資料拆分成位元組數組。以3個位元組為一組。按順序排列24位資料,再把這24位資料分成4組,即每組6位。再在每組的的最高位前補兩個0湊足一個位元組。這樣就把一個3位元組為一組的資料重新編碼成了4個位元組。當所要編碼的資料的位元組數不是3的整倍數,也就是說在分組時最後一組不夠3個位元組。這時在最後一組填充1到2個0位元組。并在最後編碼完成後在結尾添加1到2個“=”。例:将對abc進行base64編碼首先取abc對應的ascii碼值。a(65)b(66)c(67)。再取二進制值a(01000001)b(01000010)c(01000011),然後把這三個位元組的二進制碼接起來(010000010100001001000011),再以6位為機關分成4個資料塊并在最高位填充兩個0後形成4個位元組的編碼後的值(00010000)(00010100)(00001001)(00000011)。藍色部分為真實資料。再把這四個位元組資料轉化成10進制數得(16)(20)(19)(3)。最後根據base64給出的64個基本字元表,查出對應的ascii碼字元(q)(u)(j)(d)。這裡的值實際就是資料在字元表中的索引。注:base64字元表:abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/

解碼過程就是把4個位元組再還原成3個位元組再根據不同的資料形式把位元組數組重新整理成資料。

不用于加解密,算法簡單,主要用于顯示傳輸,隻能保證表面看不出源資料,長度不固定

des是data encryption standard(資料加密标準)的縮寫。des是一個分組加密算法,他以64位為分組對資料加密。同時des也是一個對稱算法:加密和解密用的是同一個算法。它的密匙長度是56位(因為每個第8位都用作奇偶校驗),密匙可以是任意的56位的數,而且可以任意時候改變。其中有極少量的數被認為是弱密匙,但是很容易避開他們。是以保密性依賴于密鑰。

des對64(bit)位的明文分組m進行操作,m經過一個初始置換ip置換成m0,将m0明文分成左半部分和右半部分m0=(l0,r0),各32位長。然後進行16輪完全相同的運算,這些運算被稱為函數f,在運算過程中資料與密匙結合。經過16輪後,左,右半部分合在一起經過一個末置換,這樣就完成了。在每一輪中,密匙位移位,然後再從密匙的56位中選出48位。通過一個擴充置換将資料的右半部分擴充成48位,并通過一個異或操作替代成新的32位資料,在将其置換換一次。這四步運算構成了函數f。然後,通過另一個異或運算,函數f的輸出與左半部分結合,其結果成為新的右半部分,原來的右半部分成為新的左半部分。将該操作重複16次,就實作了。

解密過程:在經過所有的代替、置換、異或盒循環之後,你也許認為解密算法與加密算法完全不同。恰恰相反,經過精心選擇的各種操作,獲得了一個非常有用的性質:加密和解密使用相同的算法。des加密和解密唯一的不同是密匙的次序相反。如果各輪加密密匙分别是k1,k2,k3….k16那麼解密密匙就是k16,k15,k14…k1。

用與加密解密,長度不固定,現在已經不安全,可采用3des

md5的全稱是message-digestalgorithm 5,message-digest泛指位元組串(message)的hash變換,就是把一個任意長度的位元組串變換成一定長的大整數。請注意我使用了"位元組串"而不是"字元串"這個詞,是因為這種變換隻與位元組的值有關,與字元集或編碼方式無關。 md5将任意長度的"位元組串"變換成一個128bit的大整數,并且它是一個不可逆的字元串變換算法,換句話說就是,即使你看到源程式和算法描述,也無法将一個md5的值變換回原始的字元串,從數學原理上說,是因為原始的字元串有無窮多個,這有點象不存在反函數的數學函數。

md5的典型應用是對一段message(位元組串)産生fingerprint(指紋),以防止被"篡改"。舉個例子,你将一段話寫在一個叫readme.txt檔案中,并對這個readme.txt産生一個md5的值并記錄在案,然後你可以傳播這個檔案給别人,别人如果修改了檔案中的任何内容,你對這個檔案重新計算md5時就會發現。如果再有一個第三方的認證機構,用md5還可以防止檔案作者的"抵賴",這就是所謂的數字簽名應用。

md5還廣泛用于加密和解密技術上,在很多作業系統中,使用者的密碼是以md5值(或類似的其它算法)的方式儲存的,使用者login的時候,系統是把使用者輸入的密碼計算成md5值,然後再去和系統中儲存的md5值進行比較,而系統并不"知道"使用者的密碼是什麼。

一些黑客破獲這種密碼的方法是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字元串表,另一種是用排列組合方法生成的,先用md5程式計算出這些字典項的md5值,然後再用目标的md5值在這個字典中檢索。即使假設密碼的最大長度為8,同時密碼隻能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是p(62,1)+p(62,2)....+p(62,8),那也已經是一個很天文的數字了,存儲這個字典就需要tb級的磁盤組,而且這種方法還有一個前提,就是能獲得目标賬戶的密碼md5值的情況下才可以。

不可逆加密,長度固定32或16位,為防止密碼相同人根據自己密碼推斷别人密碼,可進行加鹽處理

如果名為李自成的使用者可以檢視資料庫,那麼他可以觀察到自己的密碼和别人的密碼加密後的結果都是一樣,那麼,别人用的和自己就是同一個密碼,這樣,就可以利用别人的身份登入了。

那麼我們以前的加密方法是否對這種行為失效了呢?其實隻要稍微混淆一下就能防範住了,這在加密術語中稱為“加鹽”。具體來說就是在原有材料(使用者自定義密碼)中加入其它成分(一般是使用者自有且不變的因素),以此來增加系統複雜度。當這種鹽和使用者密碼相結合後,再通過摘要處理,就能得到隐蔽性更強的摘要值。下面請見代碼:

// 對密碼進行加鹽後加密,加密後再通過hibernate往資料庫裡存        string changedpswd=digestutils.md5hex(name+pswd);

現在是站在java虛拟機的角度來看記憶體裡面的布局,站在java虛拟機的角度,在記憶體裡面有好多好多個對象,這裡用橢圓來代表一個個對象。一個程式運作起來的時候,可能會有很多個對象在記憶體裡面配置設定,那麼對于java虛拟機來說,它運作的時候需要找到這些對象的位址,這些對象的位址怎麼找呢?java虛拟機會用一張表記錄每一個對象在什麼位置上,而這張表一般是用哈希編碼來記錄,每一個對象都有自己獨一無二的哈希編碼,根據這個編碼就可以找到相關的對象,也就是說,根據這個編碼你可以獨一無二地确定這個對象,并且可以非常快地确定這個對象所在的位置,可以簡單這麼了解哈希編碼的作用。但是java本身對哈希編碼的實作有點問題,它有可能是兩個對象,内容不同,但是它們的哈希編碼居然有可能是一樣的,而且這個機率非常高。

哈希編碼是什麼呢?它獨一無二地代表了一個對象,并且通過哈希編碼可以找到這個對象所在的位置。這就是哈希編碼的作用。

一般用對象記憶體位址作為hash值,可以保證每一對象hash值不同