HASHBYTES 及T-SQL实现
HASHBYTES 允许的输入值限制为 8000 个字节。 输出符合算法标准:MD2、MD4 和 MD5 为 128 位(即 16 个字节);SHA 和 SHA1 为 160 位(即 20 个字节);SHA2_256 为 256 位(即 32 个字节),SHA2_512 为 512 位(即 64 个字节)。
HASHBYTES 示例
1
2
3
4
5
6
7
8
|
--下面的示例返回 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函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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一次,从而完成最后的加密。(因为用户密匙不一样,这样可以使得加密出来的密文也不一样,换言之就是两个人的明文密码一样,但是加密出来的密文是不一样的。)
同样的密码,因为密匙不一样,加密出来的密文也不一样。
本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1607416 ,如需转载请自行联系原作者