通訊雙方使用 同一個密鑰
,使用加密算法配合上密鑰來加密,解密時使用加密過程的徹底逆過程配合密鑰來進行解密。算法
原始字符:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密碼字符:BCDEFGHIJKLMNOPQRSTUVWXYZA 原始書信:I love you 加密書信:J mpwf zpv 解讀後:I love you 這裏的 算法就是每一個字符采用後一位的字符替換,密鑰就是原始的英文字母表
。數據庫
由於加密和解密都用的相同的密鑰,若是密鑰再傳輸過程當中被截獲,那麼信息很容易就會被破解甚至僞造身份(如網絡通訊過程當中,A和B是兩個不認識的用戶要通訊,那麼A要把密鑰先傳給B再開始通訊,這樣B在接收密鑰的過程當中可能被第三方劫持從而形成密鑰的泄露,第三方取到密鑰後即可以破解加密信息)。數組
拿到一組或多組原文-密文對 設法找到一個密鑰,這個密鑰能夠將這些原文-密文對中的原文加密爲密文,以及將密文解密爲原文的組合,即爲成功破解。 反破解
讓破解者找不到窮舉法(暴力破解法,能夠理解爲一個一個嘗試)更有效的破解手段,並 且窮舉法的破解時間足夠長(例如數千年,那麼認爲不可破解)。安全
使用公鑰對數據進行加密獲得密文;使用私鑰對數據進行解密獲得原數據,加密解密用的算法相同,公鑰私鑰互相是可解的
(因此能夠用於數字簽名技術,但雙方不能替換,由於公鑰是要暴露出去的,是能夠被劫獲的)。bash
原數據:110 ---->加密算法都是普通的加法 公鑰是加4,私鑰是加6 加密數據:554
解密數據:111110 ---->去掉每一個的第一位,得出原數據110(注意:溢出是知足非對稱加密一個很重要的條件)。網絡
防止數據被篡改被僞造
)。 發送方用自身私鑰加密,接收方獲取簽名數據後用發送方的公鑰解密(驗證)獲取原數據,而後用獲取的原數據和發送來的原數據比對是否一致,一致則證實數據是從目標發送過來的。
一般會將原數據作hash處理後再加密,下降原數據簽名後的數據大小
(例如你要傳10G大小的文件,那麼原數據10G,做爲比對的簽名數據難道也要放10G嗎?不能這麼作,很是消耗流量和速度。因此直接對文件的hash值進行簽名,最後比對hash值便可)。
爲何簽名驗證能夠證實數據的來源是安全的(也就是是我發的而不是別人僞發或僞造的)
模擬場景:
僞造方換原數據-->簽名數據驗證之後的Hash和僞造數據的Hash不相同,驗證失敗。
僞造方換原數據和簽名數據-->公鑰驗證後的數據和被換數據的Hash不符,驗證失敗。(由於簽名數據是用的換數據方自身私鑰簽名的,只有與其對應的公鑰能夠還原回原Hash值,但此時用的仍是原數據方的公鑰去作的驗證,因此公鑰解密後獲得的並非僞造數據的Hash值)。
綜上:信息是沒有被僞造可能的。
複製代碼
能夠在不安全網絡上傳輸密鑰,公鑰別人拿到也沒用,由於他沒有私鑰沒法解數據,而私鑰又不會傳給別人只是自身持有,沒有泄露的風險 。性能
計算複雜,所以性能相比對稱加密差不少。網站
和對稱加密不一樣之處在於,非對稱加密的公鑰很容易得到,所以製造原文-密文對是沒有困難的事 因此,非對稱加密破解的關鍵只在於,如何找到找到正確的私鑰,能夠解密全部通過公鑰加密過的密文。找到這樣的私鑰即爲成功破解 因爲非對稱加密的自身特性,怎樣經過公鑰來推斷出私鑰一般是一種思路(例如 RSA),但每每 最佳手段依然是窮舉法,只是和對稱加密破解的區別在於,對稱加密破解是不斷嘗試本身的新密鑰是否能夠將拿到的原文-密文對進行加密和解密,而非對稱加密是不斷嘗試本身 的新私鑰 是否和公鑰互相可解。ui
把任意數據轉換成指定大小範圍(一般很小,例如 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不是加密!!)