在编写SQL脚本时,我们可能会遇到需要用MD5加密字符串的情况,比如存储在数据库中的用户密码需要用MD5加密。大多数数据库直接提供md5加密功能。比如MySQL和PostgreSQL中的,直接提供了名为MD5的加密函数,确实很方便。但在MSSQL中并不简单!
MSSQL版本中MD5加密的处理
使用SQLServer的朋友会发现,在MSSQL中并没有像md5这样名字的函数,所以如何用md5加密字符串真的不太容易。尤其是早期版本,比如MSSQL2000,只能自己想办法加密MD5。还能做什么,就是自己写自定义函数来处理?
如果MD5处理是在MSSQL2000中完成的,那么只能编写自己的自定义函数处理。网上也有一些专家写的剧本。我还在这里为MD5处理编译了一个脚本。有需要的朋友可以打电话到@网云科技找我,我可以私信发给你。
但这毕竟不是问题,不伦不类还挺烦人的。好在从2008年开始,MSSQL就提供了hashbytes函数,可以用MD2、MD4、MD5、SHA、SHA1、SHA2_256、SHA2_512七种算法加密字符串,一鸣惊人。今天,我们将学习如何使用哈希字节进行md5加密。
强大的哈希字节函数
哈希字节的语法格式非常简单:
HASHBYTES ( '算法', expression)
第一个参数是用单引号括起来的算法名称,可以是以下七种方式中的任何一种:
MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512
第二个参数是要加密的字符串表达式,可以是常量、变量、表达式或字段。
返回值是varbinary,最大长度为8000。没错,返回值是varbinary,不是直接字符串。先做个小实验,对比空 string和string & # 8217123456’进行MD5加密并查看返回的结果。
select hashbytes('md5',space(0));select hashbytes('md5','123456');
下图是执行的结果:
查询结果看起来是一个加密的字符串,但是类型是varbinary,和我们预想的还是有很大差距。
结合sys.fn _ sqlvarbasetostr将其转换为字符串。
我们想要的结果是MD5加密的字符串,但是hashbytes返回varbinary,这无关紧要。有一个系统函数sys.fn _ sqlvarbasetostr专门用来把varbinary转换成varchar。当然,你可以用其他方式来转换。既然MSSQL提供了直接转换函数,那就不要多此一举了。
sys.fn _ sqlvarbasetostr的语法格式非常简单:
sys.fn_sqlvarbasetostr(varbinary)
该参数是varbinary类型的表达式,返回值是varchar类型的字符串。
让我们从上面的例子中调用sys.fn _ sqlvarbasetostr来进行转换:
select sys.fn_sqlvarbasetostr(hashbytes('md5',space(0)));select sys.fn_sqlvarbasetostr(hashbytes('md5','123456'));
操作效果见下图:
从上图可以看出,varbinary转换为varchar类型,大写改为小写,离我们想要的结果更近了一步,只不过前两位0x不是MD5加密的结果部分,我们还需要使用拦截函数将其杀死。
使用截取函数获得完整的MD5加密结果。
说到拦截函数,恰好在我昨天的帖子《你最应该掌握的七个SQL字符串处理函数》中,提到的函数中至少有两个可以实现这个功能,一个是substring,一个是stuff。
我们先来看看它们的语法格式。
子字符串:
SUBSTRING(expression,start,length)
stuff:
STUFF(expression,start,length,replace)
substring是最直观的使用方法。用stuff有点绕,相当于把前两位切掉,填在空字符串里。让我们从两个方面来处理它:
select substring(sys.fn_sqlvarbasetostr(hashbytes('md5',space(0))),3,32);select stuff(sys.fn_sqlvarbasetostr(hashbytes('md5','123456')),1,2,space(0));
第一种用substring从第3位截取长度为32位,MD5加密的字符串为32位;第二个使用stuff,从第一个位中挖出2位,填入空字符串。可以说,殊途同归。具体结果见下图:
总之,如果我们想用MD5加密一个字符串,完整的语法可以是:
substring(sys.fn_sqlvarbasetostr(hashbytes('md5',待加密字符串)),3,32)
也可以是:
stuff(sys.fn_sqlvarbasetostr(hashbytes('md5',待加密字符串)),1,2,'')
希望对你有帮助!
本文来自霜华投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/599626.html