天天看點

MD5 SALT 加密

我們知道,如果直接對密碼進行散列,那麼黑客可以對通過獲得這個密碼散列值,然後通過查散列值字典(例如MD5密碼破解網站),得到某使用者的密碼。

  加Salt可以一定程度上解決這一問題。所謂加Salt方法,就是加點“佐料”。其基本想法是這樣的:當使用者首次提供密碼時(通常是注冊時),由系統自動往這個密碼裡撒一些“佐料”,然後再散列。而當使用者登入時,系統為使用者提供的代碼撒上同樣的“佐料”,然後散列,再比較散列值,已确定密碼是否正确。

  這裡的“佐料”被稱作“Salt值”,這個值是由系統随機生成的,并且隻有系統知道。這樣,即便兩個使用者使用了同一個密碼,由于系統為它們生成的salt值不同,他們的散列值也是不同的。即便黑客可以通過自己的密碼和自己生成的散列值來找具有特定密碼的使用者,但這個幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。

下面以PHP示例,講解md5($pass.$salt)加密函數。

<?php

function hash($a) {

$salt=”Random_KUGBJVY”; //定義一個salt值,程式員規定下來的随機字元串

$b=$a.$salt; //把密碼和salt連接配接

$b=md5($b); //執行MD5散列

return $b; //傳回散列

}

?>

  調用方式:$new_password=hash($_POST[password]); //這裡接受表單送出值,并進行加密

  下面詳細介紹一下加Salt散列的過程。介紹之前先強調一點,前面說過,驗證密碼時要使用和最初散列密碼時使用“相同的”佐料。是以Salt值是要存放在資料庫裡的。

使用者注冊時,

使用者輸入【賬号】和【密碼】(以及其他使用者資訊);

系統為使用者生成【Salt值】;

系統将【Salt值】和【使用者密碼】連接配接到一起;

對連接配接後的值進行散列,得到【Hash值】;

将【Hash值1】和【Salt值】分别放到資料庫中。

使用者登入時,

使用者輸入【賬号】和【密碼】;

系統通過使用者名找到與之對應的【Hash值】和【Salt值】;

系統将【Salt值】和【使用者輸入的密碼】連接配接到一起;

對連接配接後的值進行散列,得到【Hash值2】(注意是即時運算出來的值);

比較【Hash值1】和【Hash值2】是否相等,相等則表示密碼正确,否則表示密碼錯誤。

有時候,為了減輕開發壓力,程式員會統一使用一個salt值(儲存在某個地方),而不是每個使用者都生成私有的salt值。

您是否遇見過破解不了的MD5值?你是否遇見過‘奇形怪狀’的hash?這些非常有可能就是帶有salt(俗稱加鹽值),本文将為大家簡單的介紹關于加鹽值的一些資訊。

0×01. 什麼是加鹽值?

為了加強MD5的安全性(本身是不可逆的),進而加入了新的算法部分即加鹽值,加鹽值是随機生成的一組字元串,可以包括随機的大小寫字母、數字、字元,位數可以根據要求而不一樣,使用不同的加鹽值産生的最終密文是不一樣的。

0×02. 代碼中如何使用加鹽值?

由于使用加鹽值以後的密碼相當的安全,即便是你獲得了其中的salt和最終密文,破解也是一個耗費相當多時間的過程,可以說是破解單純MD5的好幾倍,那麼使用加鹽值以後的密文是如何産生的呢?

1).首先我們得到的是明文的hash值

2).進行計算擷取MD5明文hash值

3).随機生成加鹽值并插入

4).MD5插入加鹽值得到的hash

5).得到最終的密文

0×03. 如何破解出帶有加鹽值的密文

因為像windows hash(未進行syskey加密)、非加鹽值MD5等都可以通過大型的密碼(如彩虹表)表進行對比解密,是以相對而言相當的輕松,而帶有加鹽值的密文就相對而言複雜的多,現在的MD5表大概是260+G,如何加鹽值的可能性有10000個,那麼密碼表的應該是MD5 size*10000,就可以解密出原MD5表能夠解密的密碼了,一些網站也提供了對應的salt解密,但是測試以後效果并不是非常好,如正常的admin888也未解密出,實在是遺憾,畢竟MD5本是不可逆的,帶入随機值解密出最終密碼的可能性就更低了,至少是相對大多數人而言的。

0×04. 含加鹽值MD5算法的應用

目前多家的網站程式公司都已經加入了該算法,如常見的VBB論壇、discuz論壇等都采用了,甚至著名的Linux開源作業系統早已經加入了這種加密模式。可得而知,這種算法勢必會在未來應用于更多的範圍。

繼續閱讀