jy166102 发表于 2018-10-19 07:18:35

HASHBYTES 及T-SQL实现

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 .  
(
  
-- 源字符串
  
@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一次,从而完成最后的加密。(因为用户密匙不一样,这样可以使得加密出来的密文也不一样,换言之就是两个人的明文密码一样,但是加密出来的密文是不一样的。)
  同样的密码,因为密匙不一样,加密出来的密文也不一样。


页: [1]
查看完整版本: HASHBYTES 及T-SQL实现