说到数据安全,不得不提数据加密,其中MD5(Message Digest Algorithm 5,中文名为消息摘要算法第五版)是应用广泛的一种。数据加密范围很广,本文仅谈下MD5在数据库中的部分应用。


MD5的介绍和算法这里不再赘述,可以参考:

https://en.wikipedia.org/wiki/MD5

http://baike.baidu.com/view/7636.htm


在SQL Server中使用HASHBYTES函数对字符进行加密。语法是:

HASHBYTES ( '', { @input | 'input' } )

::= MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512


返回值类型为varbinary (maximum 8000 bytes)。举个简单的例子,要使用MD5的算法加密明文“111111”。

SELECT HASHBYTES('MD5','111111')

Code-1: HASHBYTES函数使用



加密后的密文是:“0x96E79218965EB72C92A549DD5A330112”。注意这里是varbinary型的,使用另一个内置的sys.fn_sqlvarbasetostr函数转为VARCHAR类型。

SELECT SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5','1111111')),3,32)

Code-2: HASHBYTES加密后再转为VARCHAR类型



数据安全(一)——MD5加密_第1张图片

Figure-1: 加密结果



MD5加密后的密文不可逆向解密的,并且是固定的32位值,即使是一个字符不同,加密后的密文也很大不同。至今为止,很多应用仍然使用MD5进行加密,或验证文件在传输过程中是否被篡改,维护了数据的完整性。但也是因为MD5自身的弱点,网上早已有提供密文反向查询的服务,据说现在世界上最大数据库能提供包含12位数字、9位小写字母加数字、7位任意字符的查询。所以说,我们在网上注册时使用的密码一定要尽可能复杂。设置合理的密码的原则,需要另开一篇博客进行讨论,这里不再展开。同样的,讨论MD5加密是否安全也非本文讨论范围之内。


另外,网上也很容易找到生成MD5密文的软件或在线查询。不过,需要提醒一下,使用在线查询的,千万别把你使用的真密码在上面去试,很有可能你的密码就被他人收集起来,作为密码字典库,即使是软件生成,也要使用不需要联网的软件。

数据安全(一)——MD5加密_第2张图片

Figure-2: MD5加密与校验对比器



下面就为这个密码字典设计一个简单的数据库查询表。MD5_DECRYPTION表只有两个字段,第一个是加密前的明文,第二个是使用MD5加密后的密文。以下脚本生成任意7位纯数字的密码。

--Non-Unicode
IF OBJECT_ID(N'dbo.MD5_DECRYPTION','U') IS NOT NULL
BEGIN
    DROP TABLE dbo.MD5_DECRYPTION
END
GO
CREATE TABLE dbo.MD5_DECRYPTION (
psd VARCHAR(40),
md5_value CHAR(32)
)
GO
CREATE UNIQUE CLUSTERED INDEX ix_un_cl_MD5_DECRYPTION_id ON MD5_DECRYPTION (psd);
GO

--insert values
WITH CTE1 AS (
SELECT 
ROW_NUMBER() OVER(ORDER BY a.object_id ASC) AS row_no
FROM sys.all_columns AS a CROSS JOIN sys.all_columns AS b
)
INSERT INTO dbo.MD5_DECRYPTION (psd,md5_value)
SELECT TOP (9999999) 
 row_no
,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',CAST(row_no AS VARCHAR(40)))),3,32) 
FROM CTE1;
GO

--create index on md5_value column
CREATE NONCLUSTERED INDEX ix_ncl_MD5_DECRYPTION_md5_value ON MD5_DECRYPTION (md5_value);
GO

Code-2: 设计任意7位纯数字的密码查询表



然后使用前面的“96E79218965EB72C92A549DD5A330112”查询加密前的明文。这样,一个简单的密码字典库就完成了。

数据安全(一)——MD5加密_第3张图片

Figure-3: 查询结果



修改HASHBYTES函数的参数为其他几个加密参数,也同样可生成不同算法的密文。注意“SHA2_256”和“SHA2_512”是SQL 2012或以上版本才支持。



参考文档:

https://msdn.microsoft.com/en-us/library/ms174415.aspx

https://www.mssqltips.com/sqlservertip/2988/understanding-the-sql-server-hashbytes-hashing-algorithms/

https://www.mssqltips.com/sqlservertip/2543/using-hashbytes-to-track-and-store-historical-changes-for-sql-server-data/

http://www.bidn.com/blogs/TomLannen/bidn-blog/2265/using-hashbytes-to-compare-columns

http://www.zhihu.com/question/21668719

http://blog.sina.com.cn/s/blog_77e8d1350100wfc7.html