如果您正在運行使用MySQL的Web應用程序那麼它把密碼或者其他敏感信息保存在應用程序裡的機會就很大保護這些數據免受黑客或者窺探者的獲取是一個令人關注的重要問題因為您既不能讓未經授權的人員使用或者破壞應用程序同時還要保證您的競爭優勢幸運的是MySQL帶有很多設計用來提供這種類型安全的加密函數本文概述了其中的一些函數並說明了如何使用它們以及它們能夠提供的不同級別的安全
雙向加密
就讓我們從最簡單的加密開始雙向加密在這裡一段數據通過一個密鑰被加密只能夠由知道這個密鑰的人來解密MySQL有兩個函數來支持這種類型的加密分別叫做ENCODE()和DECODE()下面是一個簡單的實例
mysql> INSERT INTO users (username password) VALUES (joe ENCODE(guessme abracadabra));
Query OK row affected ( sec)
其中Joe的密碼是guessme它通過密鑰abracadabra被加密要注意的是加密完的結果是一個二進制字符串如下所示
mysql> SELECT * FROM users WHERE username=joe;
+++
| username | password |
+++
| joe | ¡?i??!? |
+++
row in set ( sec)
abracadabra這個密鑰對於恢復到原始的字符串至關重要這個密鑰必須被傳遞給DECODE()函數以獲得原始的未加密的密碼下面就是它的使用方法
mysql> SELECT DECODE(password abracadabra) FROM users WHERE username=joe;
++
| DECODE(password abracadabra) |
++
| guessme |
++
row in set ( sec)
應該很容易就看到它在Web應用程序裡是如何運行的——在驗證用戶登錄的時候DECODE()會用網站專用的密鑰解開保存在數據庫裡的密碼並和用戶輸入的內容進行對比假設您把PHP用作自己的腳本語言那麼可以像下面這樣進行查詢
<?php
$query = SELECT COUNT(*) FROM users WHERE username=$inputUser AND DECODE(password abracadabra) = $inputPass;?>
提示雖然ENCODE()和DECODE()這兩個函數能夠滿足大多數的要求但是有的時候您希望使用強度更高的加密手段在這種情況下您可以使用AES_ENCRYPT()和AES_DECRYPT()函數它們的工作方式是相同的但是加密強度更高
單向加密
單向加密與雙向加密不同一旦數據被加密就沒有辦法顛倒這一過程因此密碼的驗證包括對用戶輸入內容的重新加密並將它與保存的密文進行比對看是否匹配一種簡單的單向加密方式是MD校驗碼MySQL的MD()函數會為您的數據創建一個指紋並將它保存起來供驗證測試使用下面就是如何使用它的一個簡單例子
mysql> INSERT INTO users (username password) VALUES (joe MD(guessme));
Query OK row affected ( sec)
mysql> SELECT * FROM users WHERE username=joe;
+++
| username | password |
+++
| joe | aedffcea |
+++
row in set ( sec)
現在您可以測試用戶輸入的內容是否與已經保存的密碼匹配方法是取得用戶輸入密碼的MD校驗碼並將它與已經保存的密碼進行比對就像下面這樣
mysql> SELECT COUNT(*) FROM users WHERE username=joe AND password=MD(guessme);
++
| COUNT(*) |
++
| |
++
row in set ( sec)
或者您考慮一下使用ENCRYPT()函數它使用系統底層的crypt()系統調用來完成加密這個函數有兩個參數一個是要被加密的字符串另一個是雙(或者多)字符的salt它然後會用salt加密字符串這個salt然後可以被用來再次加密用戶輸入的內容並將它與先前加密的字符串進行比對下面一個例子說明了如何使用它
mysql> INSERT INTO users (username password) VALUES (joe ENCRYPT(guessme ab));
Query OK row affected ( sec)
mysql> SELECT * FROM users WHERE username=joe;
+++
| username | password |
+++
| joe | ab/GgtZdMwak |
+++
row in set ( sec)
結果是
mysql> SELECT COUNT(*) FROM users WHERE username=joe AND password=ENCRYPT(guessme ab);
++
| COUNT(*) |
++
| |
++
row in set ( sec)
提示ENCRYPT()只能用在*NIX系統上因為它需要用到底層的crypt()庫
幸運的是上面的例子說明了能夠如何利用MySQL對您的數據進行單向和雙向的加密並告訴了您一些關於如何保護數據庫和其他敏感數據庫信息安全的理念祝您編程愉快!
From:http://tw.wingwit.com/Article/program/MySQL/201311/29366.html