2014-02-28 42 views
0

我想在做一個簡單的密碼升級,在目前有這樣的一個系統:這個密碼加密是否足夠安全?

md5(md5($pass) . $user); 

的密碼將通過JavaScript的哈希算法被髮送之前,這總是讓三個字符的密碼約20個以上的字符。

我認爲使用散列密碼的末尾作爲KEY和IV加密其餘應該應該足夠了。

$pass = '20_plus_characters_long'; 
$hash = openssl_encrypt(substr($pass, 5, -5), 'aes-128-cbc', substr($pass, 0, 5), false, md5(substr($pass, -5), true)); 

我說得對嗎?

+0

爲什麼你在javascript中使用密碼而不是使用SSL;然後爲什麼要在PHP中加密'hash'? –

+2

我會投反對票(這兩個想法)。看看https://crackstation.net/hashing-security.htm – ZeissS

回答

0

你的方案有幾個缺點。其實你加密的密碼,扔掉鑰匙。

  1. 你只需要5(base64編碼)字符作爲密鑰,所以一個 攻擊者需要約1千兆試圖破解散列數據庫 (爲了比較,每個人都可以破解8千兆MD5每秒散列) 。 然後,這個破解的數據庫哈希可能會被強制執行,但這種方法太快了。
  2. 由於您不在MD5部分中添加隨機鹽,攻擊者 可以爲特定帳戶(如用戶 「admin」)準備彩虹表,因此唯一的保護是弱加密部分。

實際上與password_hash()函數的標準方式沒有什麼優勢。這個函數將產生一個BCrypt哈希,並且成本因素決定了計算所需的時間以防止暴力攻擊。

0

這個密碼加密安全嗎?

可能不是,但它取決於您的威脅模型。

具有相同密碼的兩個用戶在密碼數據庫中將具有相同的條目。這是PRP安全性的一種損失(僞隨機排列)。也就是說,攻擊者將能夠區分真實答案和隨機答案。


md5(md5($pass) . $user);

你或許應該看看的OpenWall的Portable PHP password hashing framework (phpass)和約翰·史蒂芬的Secure Password Storage。史蒂芬甚至帶你通過威脅模型,並解釋你爲什麼做事。

+0

由於用戶名可能是唯一的,兩個相同的密碼會導致不同的散列。但是,這不是一個好的計劃。 – martinstoeckli