先用md5,再用sha1,這樣密碼會安全一點嗎?
請教一下,我如果這樣轉碼,是不是安全性會高一點。
比如: sha1(md5("password"))
我想了解的是:
1 是不是有這個必要
2 如果這樣可以,對性能影響會不會很大
或者其他有什麼是我想不到的,未來可能出現什麼問題,等等,希望能得到您的提醒,學習了!
password_hash()
PHP給用戶密碼加鹽後存儲到資料庫:
鹽: base64_encode(sha1(openssl_random_pseudo_bytes(32), true))
密碼哈希: base64_encode(hash("sha256", ("user_password" . $salt), true))
鹽長度為28個字元: `salt` char(28)
密碼哈希長度為44個字元: `password` char(44)
鹽($salt)的生成如果要更隨機和唯一,可以考慮這樣:
function io_rand() {
mt_srand();
$time = isset($_SERVER["REQUEST_TIME_FLOAT"]) ? $_SERVER["REQUEST_TIME_FLOAT"] : mt_rand();
$addr = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : mt_rand();
$port = isset($_SERVER["REMOTE_PORT"]) ? $_SERVER["REMOTE_PORT"] : mt_rand();
$pid = getmypid();
$rand = base64_encode(openssl_random_pseudo_bytes(32));
$prefix = implode("|", array($time, $addr, $port, $pid, $rand, ""));
return base64_encode(sha1(uniqid($prefix, true), true));
}
這個鹽在用戶註冊時,或者修改密碼時重新生成.
這個鹽在我的程序中還參與到用戶身份cookie的驗證.
也就是用於識別用戶身份的cookie里包含用戶編號和用戶的鹽.
驗證時就是根據用戶編號查找用戶資料庫里的鹽,再拿來跟cookie里的鹽對比,一致則通過驗證.
為了避免用戶的鹽泄露,可以對cookie進行一次aes的加密,伺服器拿到cookie後解密並驗證鹽.
/**
* AES加密
*/
function io_aes_encrypt($str, $key = IO_AES_KEY, $iv = IO_AES_IV) {
return base64_encode(
openssl_encrypt(
$str, "aes-128-cbc",
base64_decode($key), OPENSSL_RAW_DATA,
base64_decode($iv)
)
);
}
/**
* AES解密
*/
function io_aes_decrypt($str, $key = IO_AES_KEY, $iv = IO_AES_IV) {
return openssl_decrypt(
base64_decode($str), "aes-128-cbc",
base64_decode($key), OPENSSL_RAW_DATA,
base64_decode($iv)
);
}
另外,你甚至還可以先在瀏覽器端使用CryptoJS.MD5(password.toString()).toString()哈希密碼後傳給伺服器處理,保證伺服器對用戶密碼明文的不知情.
需要的話,使用https加密傳輸避免通信數據被竊聽和修改.
看來你不知道什麼是salt。生成一個隨機數,我們稱之為salt,然後在資料庫中記錄salt和h=hash(pwd + salt),查詢的時候,得到用戶的口令p,然後從資料庫中查出salt,計算hash(p+salt),看是不是等於h,等於就是對的,不等於就是不對的。
單純使用MD5之所以不好,並不是說MD5這種方法容易遭到破解,而事實上對於MD5求原象或者第二原象,也就是「逆計算」這種破解,沒有什麼很好的方法。只能通過預先計算知道許多MD5的對應關係,存在資料庫中,然後使用的時候反查,例如我知道"password"的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那麼我就用一個資料庫存起來,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道這個是口令"password『使用MD5處理之後的值,原來的口令就是"password"。MD5在身份鑒別系統中用於口令保護已經是很久了事情了,大部分黑客也有針對這種Hash方式準備相應的資料庫進行反查,這種資料庫稱為彩虹表。
所以,為了對抗彩虹表,我們要做的工作是避免預先計算,讓攻擊者無法(或者非常困難)提前計算好彩虹表。
為了反映為何彩虹表計算是可行的,我們再來算一下。我們假設用戶可能輸入的口令是鍵盤上的小寫字母和數字,共26+10=36種,之所以這樣假設是因為 一個用戶比較多的系統中總是會有一些弱口令用戶的,我們假設輸入的口令至少5個字元,至多12個字元,那麼用戶可能的輸入一共有:
,而12個位元組可能的組合應有
種。如果再考慮到用戶為了方便記憶,輸入的口令是一些已經存在的單詞或是片語,可能的輸入將會遠遠少於。用戶可能的輸入少了,就給了我們枚舉的空間。
為了阻止這種枚舉,加salt的方法是擴大用戶輸入的一種簡單有效的途徑,隨機生成一個16位元組的隨機數,加上用戶本身輸入的至多12個字元的口令,可能的輸入就有種,這麼多種可能性,任何一個機構和組織都沒有辦法存儲規模如此龐大的彩虹表。
另外一種方法是通過提升Hash的複雜度,延長攻擊者進行暴力破解時所消耗的時間。現在顯卡用於並行計算實在太容易,6位純數字的口令在顯卡看來就是秒破。Hash演算法的多次迭代就是最簡單的延長計算時間的方法,Apache的htpasswd就使用了MD5的1000次迭代,不過只是使得這些口令稍微難破解一些。
另外,題中使用了SHA1和MD5兩種演算法的方法,除了稍微提升一點計算的難度以外,並沒有多好,這種組合方法不能增加用戶輸入的可能性,另外雖然SHA1生成的是160位的Hash,但是由於輸入是一個128位的MD5,所以輸出也至多只可能有種可能,猜測的範圍也沒有縮小。所以這是原來回答我建議你使用更多次數(如1000次)MD5迭代的原因,至少應當有一個方面有稍微大一些的加強。
另外此文(暴力密碼破解器 ocl-Hashcat-plus 支持每秒猜測最多 80 億個密碼,意味著什麼?)中有數據可以供參考,bcrypt是一種有效對抗口令Hash破解的演算法,建議使用。為什麼老是在密碼上 md5,自欺欺人。
請用 bcrypt。加鹽是為了防止攻擊者直接用預先計算好 md5 的字典與密文進行匹配查找明文,因為如果用戶密碼是字典中的條目,添加隨機後綴之後幾乎不會出現在字典中,攻擊者無從構建彩虹表。
題主的做法,仍然可以被彩虹表攻擊。攻擊者只要知道你的演算法,對先前的單次 md5 構建的彩虹表再做一次 sha 構建新表就好。如果明文本身是表中條目,這樣增加的攻擊難度非常有限。
當年CSDN暴庫的時候就已經寫過這個了:
http://blog.sina.com.cn/s/blog_77e8d1350100wfc7.html
前面的回答提到加鹽的作用是避免預先計算彩虹表,這個才是正確的解釋。不要把加鹽和把密碼變複雜聯繫起來,雖然實際上有這麼一個副作用,但加鹽的原理根本就不是這個。這種誤導會導致一些莫名其妙的「加固定鹽」的無知想法。
此外什麼SHA(MD5(password))或者什麼MD5一千遍這種想法通常也是很莫名的,這些問題在我這篇博客裡面都回答了,這裡就不熬述了。首先聲明,我不是專業搞密碼學的
對於普通的應用,加鹽足夠了,推薦去看一下 @sumtec 的 沒知識真可怕——應用密碼學的笑話之MD5+Salt不安全_sumtec_新浪博客
不要再用 SHA 或者 MD5 了,加了 salt 也不行。請使用 Bcrypt.
用 bcrypt,不要再用什麼 md5、sha1 之類了。
在我看來MD5根本不是加密,只是從真實密碼到輸出的象之間的一種確定的映射,SHA1其實也是同一個道理。加密的邏輯只是將加密函數從 md5()或sha1()修改成了 sha1(md5())而已
保存密碼摘要,目的是為了防止逆向破解密碼,建議選擇PBKDF2。
我一般把賬號和密碼.連接起來md5一次然後隨機打亂,再隨機截取6位數以上放到臨時變數$token。再把原$_post[password].$token隨機截取的token一起再加密一次然後存入資料庫,表建立多一列名token存放截取的$token。各位大牛不要笑我……這樣先查用戶名,再對比密碼
http://php.net/manual/zh/faq.passwords.php
加鹽Hash,味道不錯!
// md5(1+md5(2+md5(3+md5(4+md5(5+md5(null))))))
這樣會降低安全強度的。
主要還是密碼複雜度,如果太簡單,也挺容易被解密的,前提是對方知道你的演算法,如果加個salt會安全很多,可以看看分享一些免費的MD5解密網站
MD5+salt 防止了原有的彩虹表撞庫,但是隨著計算機性能的提高,演算法複雜度不夠,那麼就可以蠻力撞庫破解了
我覺得如果安全要求高的話,需要使用sha256+salt的演算法了
這個是一般資料庫保存密碼的場景
直接上sha-3
感覺和加固定鹽差不多 還是一一對應的關係,加鹽可以增加更大的成本;
推薦閱讀: