PHP - SHA and MD5 與密碼儲存與驗證

  今天要來講一般我們在開發應用程式的時候,很常會要求使用者(用戶)註冊,註冊時會輸入帳號、e-mail、密碼,這時我們就需要對使用者輸入的資料作處理,這裡我們就要來討論對密碼的處理。一般來說,我們在儲存密碼的時候,常常不會用明碼(未加密)的形式將資料存在資料庫裡,通常會使用一種加密方式來將密碼加密,然後在存入資料庫中,例如我的密碼是abc,那我就不會大膽地直接把abc這個密碼存進MySQL或MSSQL(微軟:一般個人用的Express免費版,功能不如付費版多樣)中,而是會將密碼用加密/雜湊演算法加密過後,再存進資料庫裡面,Ex:使用MD5演算法將abc經由加密md5(“abc”)得到900150983cd24fb0d6963f7d28e17f72,然後我們就會把加密後得到的32位元的16進位數字(bit)字串存進去資料庫的密碼欄位裡面,如此一來就算資料庫裏面加密過的密碼欄位被人看到,也沒有關係,因為MD5這類型的加密很難透過反運算來還原出原本的密碼,那在使用者登入時如何驗證密碼是否正確呢? 通常會先將使用者輸入的密碼透過相同的加密演算法加密後,在跟資料庫裏面的密碼做比對,就能知道正不正確了,Ex:用剛剛的帳號登入,但密碼改用cba,然後透過md5(“cba”)計算得到3944b025c9ca7eec3154b44666ae04a0,然後將這個值跟資料庫的900150983cd24fb0d6963f7d28e17f72值比對:
password                   MD5(password)
abc              900150983cd24fb0d6963f7d28e17f72
cba              3944b025c9ca7eec3154b44666ae04a0
 
可以發現密碼不相等,就能知道使用者輸入的密碼錯誤,並回傳登入失敗的訊息到使用者的Browser端

   Message-Digest Algorithm -MD5是輸入不定長度資訊,輸出固定長度,雜湊大小為128-bits的演算法。經過程式流程,生成四個32位元資料,最後聯合起來成為一個128-bits雜湊。基本方式為,求餘、取餘、調整長度、與連結變數進行迴圈運算。得出結果。 Designed by Ronald Linn Rivest(RSA公開金鑰加密作者之一)
MD5的前身有MD2、MD3和MD4。

安全雜湊演算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼雜湊函式家族,是FIPS所認證的五種安全雜湊演算法。能計算出一個數位訊息所對應到的,長度固定的字串、雜湊大小約160位元(又稱訊息摘要)的演算法。且若輸入的訊息不同,它們對應到不同字串的機率很高。這些演算法之所以稱作「安全」是基於以下兩點(根據官方標準的描述):

 1.由訊息摘要反推原輸入訊息,從計算理論上來說是很困難的。
 2.想要找到兩組不同的訊息對應到相同的訊息摘要,從計算理論上來說也是很困難的。任何對輸入訊息的變動,都有很高的機率導致其產生的訊息摘要迥異。
  SHA家族的五個演算法,分別是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美國國家安全局(NSA)所設計

  以下用了PHP稍微測試了一下,PHP的Hash(雜湊)所提供的加密演算法
//註冊頁面
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#BBFFEE">
<form name="signUp" method="post" action="login.php">
    <table width="370"  style="border:1px #9999FF solid; padding:20px 25px 20px 25px;"  align="center">
        <tr valign="top" >
            <td align="center">
                <p>Enroll</p><br>
                <p>name: <input name="name" type="text" value=""></p>
                <p>ID: <input name="account" type="text" value=""></p>
                <p>password: <input name="password" type="password" value=""></p>
                <p>E-mail: <input name="email" type="text" value=""></p>
                <span align="center"><input type="submit" name="signup" value="Sign up"></span>
            </td>            
        </tr>
    </table>
</form>
</body>
</html>

  註冊畫面如下:


  註冊後顯示使用者與各演算法加密後的密碼等資訊:
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Result</title>
</head>
<body bgcolor="#BBFFEE">
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $account = $password ="";
if($_SERVER['REQUEST_METHOD'] == "POST")
{
    $name = test_input($_POST['name']);
    $account = test_input($_POST['account']);
    $password = test_input($_POST['password']);
    $email = test_input($_POST['email']);

}
function test_input($data)
{
    $data =trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
?>
<div width="370" style="border:1px #9999FF solid; padding:20px 25px 20px 25px;"  align="center">

<?php
echo "<p align='left' style='word-wrap:break-word;'>";    
echo "註冊資料:","<br>";
echo "Name: ".$name;
echo "<br>";
echo "Account:  ".$account;
echo "<br>";
echo "Password: ".$password;
echo "<br>";
echo "Password(SHA256): ".hash("sha256", $password);
echo "<br>";
echo "Password(SHA512): ".hash("sha512", $password);
echo "<br>";
echo "Password(MD5): ".hash("md5", $password);
echo "<br>";
echo "Password(SHA1): ".hash("sha1", $password);
echo "<br>";
echo "</p>";
?>
</div>
</body>
</html>

  註冊後畫面如下:


**P.S. / Reference:  .NET 字串加密 MD5、SHA1
           MD5 algorithm wiki entry
           SHA algorithm wiki entry
           線上加密程式,以上你可以輸入字串,線上得到運算的結果
           php處理密碼的幾種方式

results matching ""

    No results matching ""