如何利用MySQL加密函数保护Web网站敏感数据
如果您正在运行使用MySQL的Web应用程序,那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者破坏应用程序,同时还要保证您的竞争优势。幸运
如果您正在运行使用MySQL的Web应用程序,,那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者破坏应用程序,同时还要保证您的竞争优势。幸运的是,MySQL带有很多设计用来提供这种类型安全的加密函数。本文概述了其中的一些函数,并说明了如何使用它们,以及它们能够提供的不同级别的安全。
双向加密
就让我们从最简单的加密开始:双向加密。在这里,一段数据通过一个密钥被加密,只能够由知道这个密钥的人来解密。MySQL有两个函数来支持这种类型的加密,分别叫做ENCODE()和DECODE()。下面是一个简单的实例:
mysql> INSERT INTO users (username, password) VALUES ('joe', ENCODE('guessme', 'abracadabra'));
Query OK, 1 row affected (0.14 sec)
其中,Joe的密码是guessme,它通过密钥abracadabra被加密。要注意的是,加密完的结果是一个二进制字符串,如下所示:
mysql> SELECT * FROM users WHERE username='joe';
+----------+----------+
| username | password |
+----------+----------+
| joe | ¡?i??!? |
+----------+----------+
1 row in set (0.02 sec)
abracadabra这个密钥对于恢复到原始的字符串至关重要。这个密钥必须被传递给DECODE()函数,以获得原始的、未加密的密码。下面就是它的使用方法:
mysql> SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe';
+---------------------------------+
| DECODE(password, 'abracadabra') |
+---------------------------------+
| guessme |
+---------------------------------+
1 row in set (0.00 sec)
应该很容易就看到它在Web应用程序里是如何运行的——在验证用户登录的时候,DECODE()会用网站专用的密钥解开保存在数据库里的密码,并和用户输入的内容进行对比。假设您把PHP用作自己的脚本语言,那么可以像下面这样进行查询:
$query = "SELECT COUNT(*) FROM users WHERE username='$inputUser' AND DECODE(password, 'abracadabra') = '$inputPass'";?>
提示:虽然ENCODE()和DECODE()这两个函数能够满足大多数的要求,但是有的时候您希望使用强度更高的加密手段。在这种情况下,您可以使用AES_ENCRYPT()和AES_DECRYPT()函数,它们的工作方式是相同的,但是加密强度更高。
绛旓細ENCRYPT(str, [salt]) 鍒╃敤Unix crypt()绯荤粺璋冪敤锛屽str杩涜鍔犲瘑锛宻alt鍙傛暟瑕佹眰鑷冲皯鍖呭惈2涓瓧绗︺傛棤salt鏃讹紝绯荤粺浼氳嚜鍔ㄧ敓鎴愪竴涓侻D5(str) 鍑芥暟鐢ㄤ簬璁$畻瀛楃涓茬殑MD5鏁e垪鍊硷紝128浣嶏紝浠16杩涘埗琛ㄧず銆傚綋MySQL鍗囩骇鏃讹紝OLD_PASSWORD(str) 鐢ㄤ簬鍏煎鏃х増鏈鎴风鐨勫瘑鐮侊紝杩斿洖4.1涔嬪墠鐨凱ASSWORD()鍑芥暟鎵ц缁撴灉銆
绛旓細MySQL鏈変袱涓鍑芥暟鏉ユ敮鎸佽繖绉嶇被鍨嬬殑鍔犲瘑锛屽垎鍒彨鍋欵NCODE()鍜孌ECODE()銆備笅闈㈡槸涓涓畝鍗曠殑瀹炰緥锛mysql> INSERT INTO users (username, password) VALUES ('joe', ENCODE('guessme', 'abracadabra'));Query OK, 1 row affected (0.14 sec)鍏朵腑锛孞oe鐨勫瘑鐮佹槸guessme锛屽畠閫氳繃瀵嗛挜abracadabra琚姞瀵嗐傝娉...
绛旓細棣栧厛锛屽厛浠嬬粛涓鍔犲瘑鍑芥暟锛孭ASSWORD(string)鍑芥暟鍙互瀵瑰瓧绗︿覆string杩涜鍔犲瘑锛屼唬鐮佸涓嬶細SELECT PASSWORD('you');濡備笅鍥炬墍绀猴細鎵ц绗竴姝ョ殑SQL璇彞锛屾煡璇㈢粨鏋滄槸涓涓插瓧绗︿覆锛屽苟涓擯ASSWORD(string)鍑芥暟鍔犲瘑鏄笉鍙嗚浆锛屽涓嬪浘鎵绀猴細鍙﹀涓涓姞瀵嗗嚱鏁癕D5(string)锛屼富瑕侀拡瀵规櫘閫氱殑鏁版嵁杩涜鍔犲瘑锛屼唬鐮佸涓嬶細SELECT M...
绛旓細鎻掑叆鍔犲瘑鏁版嵁:1銆両NSERT INTO userdata(username,pasword,encryptedpassword) 2銆乂ALUES ('smith','htims',AES_ENCRYPT('htims','key')) 涓婇潰鐨勬彃鍏ヨ鍙ユ湁涓変釜瀛楁,鈥滅敤鎴峰悕鈥濄佲滃瘑鐮佲濆拰鈥滃姞瀵嗙殑瀵嗙爜鈥濄侫ES_ENCRYPT()鍑芥暟闇瑕佷竴涓渒ey鈥濇潵鍗忓姪鍔犲瘑,鍚屾牱,瑙e瘑涔熼渶瑕佸畠銆備粠琛ㄤ腑鏌ヨ鍔犲瘑鏁版嵁1銆丼ELECT usernam...
绛旓細鍥炵瓟锛1銆傛湁鐐逛技 base64_encode鐨勫湪C#閲屾湁瀵瑰簲鐨勭殑鍑芥暟 瑕佷箞灏辨槸鐢 discuz 鐨 authcode 鍔犲瘑鍑芥暟銆備綘鍙互涓奃ISCUZ瀹樻柟缃戠珯銆傛壘鍒癆SP.NET鐨勫姞瀵嗗嚱鏁般備絾鍓嶆彁,浣犲繀椤昏瑕佺煡閬撳畠鐨勫瘑閽ャ
绛旓細鍦ㄧ敤鎴风櫥褰曟椂锛岄渶瑕佸厛瀵圭敤鎴疯緭鍏ョ殑瀵嗙爜杩涜鍚屾牱鐨鍔犲瘑澶勭悊锛岀劧鍚庡啀灏嗗姞瀵嗗悗鐨勫瘑鐮佷笌鏁版嵁搴撲腑瀛樺偍鐨勫姞瀵嗗悗鐨勫瘑鐮佽繘琛屾瘮瀵癸紝浠ラ獙璇佺敤鎴风殑韬唤銆侻ySQL涓姞瀵嗗瘑鐮佺殑鏂瑰紡鏈夊緢澶氱锛屾瘮濡侻D5銆丼HA-1銆丼HA-256绛夛紝甯哥敤鐨勬柟寮忔槸浣跨敤MD5杩涜瀵嗙爜鍔犲瘑銆傚湪MySQL涓娇鐢∕D5鍔犲瘑瀵嗙爜鐨勬柟娉曟槸浣跨敤MySQL鍐呯疆鐨鍑芥暟MD5()銆
绛旓細鍦∕ySQL涓紝涓轰簡瀹炵幇瀹夊叏鐨勬暟鎹紶杈擄紝鍙互鍒╃敤mysql_ssl_set()鍑芥暟鏉ヨ缃甋SL杩炴帴銆傝繖涓嚱鏁板簲鍦╩ysql_real_connect()璋冪敤涔嬪墠閰嶇疆锛屼互纭繚鍔犲瘑杩炴帴鐨勬纭缃傚湪浣跨敤涔嬪墠锛岄渶瑕佺‘淇濆鎴风搴撳凡缁忓惎鐢ㄤ簡OpenSSL鏀寔锛屽惁鍒欒鍑芥暟灏嗕笉浼氫骇鐢熶换浣曚綔鐢ㄣ傝皟鐢╩ysql_ssl_set()鏃讹紝闇瑕佹彁渚涗互涓嬪嚑涓弬鏁扮殑璺緞淇℃伅锛歬...
绛旓細a) 鍑芥暟 AES_ENCRYPT(str ,key_str ) , AES_DECRYPT(crypt_str ,key_str )鍑芥暟浣跨敤璇存槑锛氳繖浜涘嚱鏁板厑璁镐娇鐢ㄥ畼鏂 AES 杩涜鍔犲瘑鍜屾暟鎹姞瀵 ( 楂樼骇鍔犲瘑鏍囧噯 ) 绠楁硶 , 鍗充互鍓嶄汉浠墍鐔熺煡鐨 鈥淩ijndael鈥 銆 淇濆瘑鍏抽敭瀛楃殑闀垮害涓 128 姣旂壒锛屼笉杩囦綘鍙互閫氳繃鏀瑰彉婧愯屽皢鍏跺欢闀垮埌 256 姣旂壒銆傛垜浠夋嫨浜 128...
绛旓細浣跨敤mysql鐨勫姞瀵嗗嚱鏁杩愯锛歴elect HEX(AES_ENCRYPT( 'test aes encrypt','123')) as aesTest 杈撳嚭瀵嗘枃锛17CDAE577C715A0B5A922BF07462622AF15884B6D0F596B0241DC8F966C4A93F https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt 瀹樻柟鏂囨。瑙i噴锛歍he ...
绛旓細mysql_native_password鏄惁鍙唌ysql缁欐暟鎹鍔犲瘑鐨鍑芥暟password()鏄笉鍙嗙殑銆侻ySQL8.0.4寮濮,榛樿韬唤璁よ瘉寮濮嬫敼鍙樸傚洜涓轰箣鍓,MySQL鐨瀵嗙爜璁よ瘉鎻掍欢鏄渕ysql_native_password鈥,鑰岀幇鍦浣跨敤鐨勬槸鈥渃aching_sha2_password鈥濄