通訊雙方使用同一個密鑰
,使用加密算法配合上密鑰來加密,解密時使用加密過程的徹底逆過程配合密鑰來進行解密。算法
原始字符:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密碼字符:BCDEFGHIJKLMNOPQRSTUVWXYZA
原始書信:I love you
加密書信:J mpwf zpv
解讀後:I love you
這裏的算法就是每一個字符采用後一位的字符替換,密鑰就是原始的英文字母表
。數據庫
由於加密和解密都用的相同的密鑰,若是密鑰再傳輸過程當中被截獲,那麼信息很容易就會被破解甚至僞造身份(如網絡通訊過程當中,A和B是兩個不認識的用戶要通訊,那麼A要把密鑰先傳給B再開始通訊,這樣B在接收密鑰的過程當中可能被第三方劫持從而形成密鑰的泄露,第三方取到密鑰後即可以破解加密信息)。數組
拿到一組或多組原文-密文對 設法找到一個密鑰,這個密鑰能夠將這些原文-密文對中的原文加密爲密文,以及將密文解密爲原文的組合,即爲成功破解。反破解
讓破解者找不到窮舉法(暴力破解法,能夠理解爲一個一個嘗試)更有效的破解手段,並 且窮舉法的破解時間足夠長(例如數千年,那麼認爲不可破解)。安全
使用公鑰對數據進行加密獲得密文;使用私鑰對數據進行解密獲得原數據,加密解密用的算法相同,公鑰私鑰互相是可解的
(因此能夠用於數字簽名技術,但雙方不能替換,由於公鑰是要暴露出去的,是能夠被劫獲的)。網絡
原數據:110 ---->加密算法都是普通的加法 公鑰是加4,私鑰是加6
加密數據:554
解密數據:111110 ---->去掉每一個的第一位,得出原數據110(注意:溢出是知足非對稱加密一個很重要的條件)。性能
因爲私鑰和公鑰互相可解,所以非對稱加密還能夠應用於數字簽名技術(主要是爲了驗證數據的來源,也就是要肯定是我給你發的數據而不是別人給你發的數據,防止數據被篡改被僞造
)。
發送方用自身私鑰加密,接收方獲取簽名數據後用發送方的公鑰解密(驗證)獲取原數據,而後用獲取的原數據和發送來的原數據比對是否一致,一致則證實數據是從目標發送過來的。網站
一般會將原數據作hash處理後再加密,下降原數據簽名後的數據大小
(例如你要傳10G大小的文件,那麼原數據10G,做爲比對的簽名數據難道也要放10G嗎?不能這麼作,很是消耗流量和速度。因此直接對文件的hash值進行簽名,最後比對hash值便可)。加密
爲何簽名驗證能夠證實數據的來源是安全的(也就是是我發的而不是別人僞發或僞造的) 模擬場景: 僞造方換原數據-->簽名數據驗證之後的Hash和僞造數據的Hash不相同,驗證失敗。 僞造方換原數據和簽名數據-->公鑰驗證後的數據和被換數據的Hash不符,驗證失敗。(由於簽名數據是用的換數據方自身私鑰簽名的,只有與其對應的公鑰能夠還原回原Hash值,但此時用的仍是原數據方的公鑰去作的驗證,因此公鑰解密後獲得的並非僞造數據的Hash值)。 綜上:信息是沒有被僞造可能的。
使用非對稱加密通訊,能夠在不可信網絡上將雙方的公鑰傳給對方,而後在發消息前分別對消息使用 對方的公鑰來加密和使用自身的私鑰來簽名,作到不可信網絡上的可靠密鑰傳播及加密通訊。
A和B通訊,首先B要把本身的公鑰發給A,A用B本身的公鑰加密數據傳給B,B再用本身的私鑰解密。可是公鑰由於是暴露的,可能被C得到,那麼C獲取B的公鑰後徹底能夠本身發僞造消息給B,因此A和B通訊的時候B須要知道信息是A發送的,因此通訊中A會把自身的公鑰發給B,再發送數據的時候對數據用自身的私鑰加密,由於公鑰私鑰互相可解,發送到B後B用A的公鑰去解密,比對用B公鑰加密B私鑰解密和A私鑰加密(簽名)A公鑰解密(驗證)的數據結果是否一致,若是一致則證實是A發送的數據而不是別人篡改過的數據。spa
能夠在不安全網絡上傳輸密鑰,公鑰別人拿到也沒用,由於他沒有私鑰沒法解數據,而私鑰又不會傳給別人只是自身持有,沒有泄露的風險 。code
計算複雜,所以性能相比對稱加密差不少。
和對稱加密不一樣之處在於,非對稱加密的公鑰很容易得到,所以製造原文-密文對是沒有困難的事 因此,非對稱加密破解的關鍵只在於,如何找到找到正確的私鑰,能夠解密全部通過公鑰加密過的密文。找到這樣的私鑰即爲成功破解 因爲非對稱加密的自身特性,怎樣經過公鑰來推斷出私鑰一般是一種思路(例如 RSA),但每每 最佳手段依然是窮舉法,只是和對稱加密破解的區別在於,對稱加密破解是不斷嘗試本身的新密鑰是否能夠將拿到的原文-密文對進行加密和解密,而非對稱加密是不斷嘗試本身 的新私鑰 是否和公鑰互相可解。
把任意數據轉換成指定大小範圍(一般很小,例如 256 字節之內)的數據。
從數據中提出摘要信息
,所以最主要用途是數字指紋。 (也就是根據數據的全部特徵
算出一個值)。
public class A{ private String name; private int age; private void hashCode(){ //只是舉一個例子,實際中的hashCode計算要比這個複雜不少,由於要儘可能減小Hash碰撞的機率. return name.length()+age; } }
例如 Java 中的 hashCode() 方法。
怎麼重寫 hashCode 方法?
把 equals() 方法中的每一個用於判斷相等的變量都放進 hashCode() 中,一塊兒生成一個儘可能不會碰撞的整數便可 。
爲何每次重寫 equals() 方法都須要?
由於你要把新的判斷條件放進 hashCode() 。
特別注意:hashCode相同不表明對象相同,由於它只是數據的特徵值,equals方法相同對象纔是同樣的,但hashCode能夠用於**快速檢查對象**是否相同,畢竟hashCode只是一個值的比較,而equals是多個值的比較。
從網絡上下載文件後,經過比對文件的 Hash 值(例如 MD五、SHA1),能夠確認下載的文件是否有損壞。若是下載的文件 Hash 值和文件提供方給出的 Hash 值一致,則證實下載的文件是無缺無損的。
HashMap(經過hashCode/Map的長度-1算出一個餘數,根據餘數確認在數組中的index位置,參考HashMap源碼)。
當重要數據必須暴露的時候,有時能夠選擇暴露它的 Hash 值(例如 MD5),以保障原數據的安全。 例如網站登陸時,能夠只保存用戶密碼的 Hash 值,在每次登陸驗證時只須要將輸入的密碼的 Hash 值和數據庫中保存的 Hash 值做比對就好,網站無需知道用戶的密碼。這樣,當網站數據失竊時,用戶不會由於自身的密碼被盜致使其餘網站的安全也受到威脅(有可能設置的密碼都是相同的)。
不是(劃重點!!!)
。Hash 是單向過程,沒法進行逆向恢復操做(10G的文件進行hash後可能hashcode只有幾KB大小,那麼這幾KB怎麼可能恢復成10G的原文件呢),所以 Hash 不屬於加密。(MD5不是加密!!)