本节介绍了加密和加密值。若你想要储存一些由可能包含任意字节值的加密函数返回的结果,使用BLOB列而不是 CHAR 或VARCHAR 列,从而避免由于结尾空格的删除而改变一些数据值的潜在问题。
- AES_ENCRYPT(str,key_str) , AES_DECRYPT(crypt_str,key_str)
这些函数允许使用官方AES进行加密和数据加密 (高级加密标准 ) 算法, 即以前人们所熟知的 “Rijndael”。 保密关键字的长度为128比特,不过你可以通过改变源而将其延长到 256 比特。我们选择了 128比特的原因是它的速度要快得多,且对于大多数用途而言这个保密程度已经够用。
输入参数可以为任何长度。若任何一个参数为NULL,则函数的结果也是NULL。
因为 AES 是块级算法,使用填充将不均衡长度字符串编码,这样结果字符串的长度的算法为 16 * (trunc(string_length / 16) + 1)。
若 AES_DECRYPT()检测到无效数据或不正确填充,它会返回 NULL。然而,若输入的资料或密码无效时, AES_DECRYPT()有可能返回一个非 NULL 值 (可能为无用信息 )。
你可以通过修改你的问询,从而使用AES函数以加密形式来存储数据:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
AES_ENCRYPT()和AES_DECRYPT() 可以被看作MySQL中普遍通用的密码最安全的加密函数。
- DECODE(crypt_str,pass_str)
使用 pass_str 作为密码,解密加密字符串 crypt_str, crypt_str 应该是由ENCODE()返回的字符串。
- ENCODE(str,pass_str)
使用pass_str 作为密码,解密 str 。 使用DECODE()解密结果。
结果是一个和str长度相同的二进制字符串。若你想要将其保留在一个列中,可使用 BLOB 列类型。
- DES_DECRYPT(crypt_str[,key_str])
使用DES_ENCRYPT()加密一个字符串。若出现错误,这个函数会返回 NULL。
注意,这个函数只有当MySQL在SSL 的支持下配置完毕时才会运作。请参见5.8.7节,“使用安全连接”.
假如没有给定 key_str 参数, DES_DECRYPT() 会首先检查加密字符串的第一个字节, 从而确定用来加密原始字符串的DES密码关键字数字,之后从DES关键字文件中读取关键字从而解密信息。为使其运行,用户必须享有 SUPER 特权。可以选择--des-key-file服务器指定关键字文件。
假如你向这个函数传递一个key_str 参数,该字符串被用作解密信息的关键字。
若 crypt_str 参数看起来不是一个加密字符串, MySQL 会返回给定的 crypt_str。
- DES_ENCRYPT(str[,(key_num|key_str)])
用Triple-DES 算法给出的关键字加密字符串。若出现错误,这个函数会返回NULL。
注意,这个函数只有当MySQL 在SSL的支持下配置完毕后才会运行。请参见5.8.7节,“使用安全连接”.
使用的加密关键字的选择基于第二个到 DES_ENCRYPT()的参数,假如给定:
参数 |
说明 |
无参数 |
使用来自DES关键字文件的第一个关键字。 |
key_num |
使用DES 关键字文件给出的关键字数字(0-9)。 |
key_str |
使用给出的关键字字符串为 str 加密。 |
选择--des-key-file服务器指定关键字文件。
返回字符串是一个二进制字符串,其中第一个字符为 CHAR(128 | key_num)。
加上 128使得识别加密关键字更加容易。若你使用一个字符串关键字,则 key_num 为127。
结果的字符串长度为 new_len = orig_len + (8-(orig_len % 8))+1。
DES关键字文件中的每一行都具有如下格式:
key_num des_key_str
每个key_num 必须是一个从0到0范围内的数字。文件中行的排列顺序是任意的。 des_key_str 是用来加密信息的字符串。在数字和关键字之间应该至少有一个空格。若你未指定任何到DES_ENCRYPT()的关键字参数,则第一个关键字为默认的使用关键字。
使用FLUSH DES_KEY_FILE语句,你可以让 MySQL从关键字文件读取新的关键字值。这要求你享有 RELOAD特权。
拥有一套默认关键字的一个好处就是它向应用程序提供了一个检验加密列值的方式,而无须向最终用户提供解密这些值的权力。
mysql> SELECT customer_address FROM customer_table
> WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
- ENCRYPT(str[,salt])
使用Unix crypt() 系统调用加密 str。 salt 参数应为一个至少包含2个字符的字符串。若没有给出 salt 参数,则使用任意值。
mysql> SELECT ENCRYPT('hello');
-> 'VxuFAJXVARROc'
至少在一些系统中,ENCRYPT()除了str的前八位字符之外会忽略所有内容。这个行为由下划线的crypt() 系统调用的执行所决定。
假如crypt()在你的系统中不可用(正如在 Windows系统), ENCRYPT() 则会始终返回NULL。鉴于这个原因,我们向你推荐使用 MD5() 或SHA1() 来代替,因为这两个函数适合所有的平台。
- MD5(str)
为字符串算出一个 MD5 128比特检查和。该值以32位十六进制数字的二进制字符串的形式返回, 若参数为 NULL 则会返回 NULL。例如,返回值可被用作散列关键字。
mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
这是"RSA Data Security, Inc. MD5 Message-Digest Algorithm."
假如你想要将这个值转化为大写字母,参见12.8节,“Cast函数和操作符”中BINARY操作符项中给出的二进制字符串转换。
- OLD_PASSWORD(str)
当PASSWORD()的执行变为改善安全性时,OLD_PASSWORD()会被添加到 MySQL。OLD_PASSWORD()返回从前的PASSWORD()执行值( 4.1之前),同时允许你为任何4.1 之前的需要连接到你的5.1 版本MySQL服务器前客户端设置密码,从而不至于将它们切断。请参见5.7.9节,“MySQL 4.1中的密码哈希处理”。
- PASSWORD(str)
从原文密码str 计算并返回密码字符串,当参数为 NULL 时返回 NULL。这个函数用于用户授权表的Password列中的加密MySQL密码存储
mysql> SELECT PASSWORD('badpwd');
-> '7f84554057dd964b'
PASSWORD() 加密是单向的 (不可逆 )。
PASSWORD() 执行密码加密与Unix 密码被加密的方式不同。请参见ENCRYPT()。
注释: PASSWORD()函数在MySQL服务器中的鉴定系统使用;你不应将它用在你个人的应用程序中。为达到同样目的,可使用 MD5()或SHA1() 代替。 更多关于在您的应用程序中处理密码及安全鉴定的信息见RFC 2195
- SHA1(str) SHA(str)
为字符串算出一个 SHA1 160比特检查和,如RFC 3174 (安全散列算法 )中所述。该值被作为40位十六进制数字返回,而当参数为NULL 时则返回 NULL。这个函数的一个可能的用处就在于其作为散列关键字。你也可以将其作为存储密码的密码安全函数使用。
mysql> SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()可以被视为一个密码更加安全的函数,相当于 MD5()。 SHA() 和SHA1()具有相同的意义。