HASHBYTES 及T-SQL实现


HASHBYTES 允许的输入值限制为 8000 个字节。 输出符合算法标准:MD2、MD4 和 MD5 为 128 位(即 16 个字节);SHA 和 SHA1 为 160 位(即 20 个字节);SHA2_256 为 256 位(即 32 个字节),SHA2_512 为 512 位(即 64 个字节)。

 

HASHBYTES 示例


--下面的示例返回 Test1 表 c1 列中值的 SHA1 哈希。
USE demo
GO
CREATE TABLE dbo.Test1 (c1 nvarchar(50));
GO
INSERT dbo.Test1 VALUES ('This is a test.'), ('This is test 2.');
GO
SELECT HASHBYTES('SHA1', c1) FROM dbo.Test1;

 

T-SQL实现


创建T-SQL的MD5函数:

Create FUNCTION [dbo].[MD5]
(
-- 源字符串
@src varchar(255)
)
RETURNS varchar(255)
WITH EXECUTE AS CALLER
AS
BEGIN
-- 存放md5加密串(ox)
DECLARE @smd5 varchar(34)
-- 加密字符串
SELECT @smd5 = sys.fn_VarBinToHexStr(hashbytes('MD5', @src));
SELECT @smd5 = SUBSTRING(@smd5,3,32) --32位
-- 返回加密串
RETURN @smd5
END

 

可以调用,但是不建议明文形式入数据库再加密,这样网络传输的过程中可能被截包,然后分析出明文密码。

通常是加密之后将密文带入数据库。

不过,数据库中存储简单的MD5加密串已经不在安全可靠了,一旦被脱库,后果不堪设想...

 

建议加入自定义的加密方式配合MD5进行二次加密,有些人认为一次MD5不安全,可以两次、三次、其实对于现在的磁盘空间和CPU运算速度,爆破已经不再是不可能的事儿,无论你几次MD5,对于爆破来说无非就是多几个字段来存储而已。

 

目前玩家密码和一些敏感信息都是经过了二次加密之后存储的,既然谈到了密码安全,大概思路分享一下:

MD5之后再通过CLR函数将C#编写的对称加密DLL 内置到数据库中,采用用户唯一ID做密匙,然后在将DES之后的密文MD5一次,从而完成最后的加密。(因为用户密匙不一样,这样可以使得加密出来的密文也不一样,换言之就是两个人的明文密码一样,但是加密出来的密文是不一样的。)

同样的密码,因为密匙不一样,加密出来的密文也不一样。