??日常開發(fā)中亭畜,我們經常會用到求某個數(shù)據的哈希值扮休,對給服務器傳一段數(shù)據時,會給該數(shù)據進行加密拴鸵。那我們有沒有想過什么是
哈希
(Hash)玷坠,哈希是不是加密呢,哈希
和加密
之間有什么關系呢劲藐?
哈希的定義
??Hash
八堡,字面意思就是散列,就是把任意長度的輸入通過散列算法變換成固定長度的輸出瘩燥,該輸出就是散列值秕重。這種轉換是一種壓縮映射,也就是厉膀,散列值的空間通常遠小于輸入的空間溶耘,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值服鹅。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)凳兵。
哈希的特點
- 算法是公開的
- 對相同數(shù)據運算,得到的結果是一樣的
- 對不同數(shù)據運算,如
MD5
得到的結果默認是128位
,32個字符(16進制標識) - 哈希得到的結果,沒法做逆運算
- 哈希值也稱為
信息摘要
企软,信息“指紋”庐扫,常用來做數(shù)據識別的
哈希的用途
- 項目開發(fā)中我們經常用到對用戶的密碼求哈希值進行密碼加密
- 搜素引擎里面的數(shù)據檢索也會用到哈希
- 數(shù)據的版權信息也會用到哈希
- 數(shù)字簽名
??總結:Hash
不是真正意義上的加密,它是一種散列碰撞的算法。對數(shù)據求哈希值形庭,是可以通過一些網站反查詢到的铅辞,所以與服務器傳遞密碼,采用傳Hash
值的方式也不是很安全萨醒。那么如何才能真正的做到密碼的傳遞絕對的安全呢斟珊?
HMAC加密方案
1、先通過RSA
的加密方式先從服務端請求一個key富纸,并保存到本地(最好放到鑰匙串)
2囤踩、將key
和密碼按一定規(guī)則做拼接并求Hash
值
3、將上一步的Hash
值拼接上當前時間戳再求Hash
值晓褪,登陸的時候傳遞密碼只需要傳遞此Hash值堵漱。因為服務端已經保存過了設置密碼時保存的密碼Hash
值,服務端通過驗證收到請求的上一分鐘和此時的Hash
值涣仿。
數(shù)字簽名
1勤庐、原始數(shù)據進行Hash
2、使用RSA
加密hash值
(這部分數(shù)據就是數(shù)據的簽名信息)
3好港、將數(shù)據
+數(shù)字簽名
一起打包發(fā)送傳遞