• sqlserver 进行MD5加密


    官方定义函数:

    HashBytes ( '<algorithm>', { @input | 'input' }

    <algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1

    参数解释:

    algorithm:标识用于对输入执行哈希操作的哈希算法。这是必选参数,无默认值。需要使用单引号。

    @input : 数据类型为 varchar、nvarchar 或 varbinary

    'input' 字符串数据

    返回值:

    varbinary (最大8000字节)

    备注:允许的输入值限制为 8000 个字节。输出符合算法标准:MD2、MD4 和 MD5 为 128 位(即 16 个字节);SHA 和 SHA1 为 160 位(即 20 个字节)

    一:示例MD5加密:

    一个完整的写法:

    PRINT    LOWER(RIGHT(sys.fn_varbintohexstr(HASHBYTES('MD5','这个字符串需要加密')),32))   >> 8926206f9ebb0bee4bbb0724fccb4410

    下面逐步拆分

    1.先用HashBytes函数看看生成的结果

    PRINT HASHBYTES('MD5','这个字符串需要加密')   >>  0x8926206F9EBB0BEE4BBB0724FCCB4410

    由于该函数返回的值是二进制varbinary 数据,不是字符串不能直接使用,所以要将其转换为字符串

    2.用sys.fn_varbintohexstr(@pbinin)

    @pbinin : varbinary (max) 数据类型

    返回:nvarchar 数据类型

    PRINT sys.fn_varbintohexstr(HASHBYTES('MD5','这个字符串需要加密'))  >>  0x8926206f9ebb0bee4bbb0724fccb4410

    3.如何得到32位的MD5值,貌似最大也就只能到32位,使用 Right 函数进行截取

    PRINT RIGHT(sys.fn_varbintohexstr(HASHBYTES('MD5','这个字符串需要加密')),32) >> 8926206f9ebb0bee4bbb0724fccb4410

    函数定义

    RIGHT ( character_expression , integer_expression )
    参数:
    character_expression :可为字符或二进制数据表达式,常量,变量,列,任何能隐式转换为varchar或nvarchar的数据类型(text,ntext需要进行显示转换)
    integer_expression :正整数,将返回的字符数
    返回值:character_expression 若为 非Unicode 返回 varchar , 若为unicode 则返回nvarchar

    4.如果需要统一大小写 可使用  lower(character_expression )  , upper(character_expression ) 进行转换

    二:关于MD5加密的字符编码问题

    先来几段对比

    1. 字符 “è”

    image

    SQLServer :C05FC85230C60ED8FECB3670E77E603D

    结果:与C# gb2312对应

    2. 字符 “这是汉字”

    image

    SQLServer : E8C9AB48B603F81B87F4ED4F1005BB6E

    结果:与C# gb2312对应

    3. 字符 “123456”

    image

     

    SQLServer : E10ADC3949BA59ABBE56E057F20F883E

    结果:与C# gb2312,utf-8 , utf-7 , ascii  对应

    4.字符 “pxs123”

    image

     

    SQLServer : 684D95499489435C9351EFCDD68B25F2

    结果:与C# gb2312,utf-8 , utf-7 , ascii  对应

    4.字符 “pxs!@#.”

    image

    SQLServer :FC05D7826726E773E993BDCA88F6B181

    结果:与C# gb2312,utf-8 , ascii  对应

    5.字符 英文符号“!@#.&*)|_;“

    image

    SQLServer :4C782D772102482D09696D11BDE1A02A

    结果:与C# gb2312,utf-8 , ascii  对应

    6.字符 中文英混合符号“《!)*、“

    image

    SQLServer :1A891B7B5B3285925E2783694C2A367C

    结果:与C# gb2312对应

    6.字符 中文英混合符号“汉字hanzi“

    image

    SQLServer :49212C24BDB2FA254880119A332F86D6

    结果:与C# gb2312对应

    8.字符 “プログラミン“

    image

    SQLServer :045B556A9CF5F0FE92EC7A7C9B3F66CA

    结果:与C# gb2312对应

    综上对比:

    sqlserver中md5加密函数,字符存在非英文字符会按照gb2312方式编码计算出加密值,那么C#,JS等计算MD5加密值是就需要转为gb2312编码,才能得出一样的结果。

    若为都为英文字符时,用utf-8编辑即可

    那一天我二十一岁,在我一生的黄金时代。
    我有好多奢望。我想爱,想吃,还想在一瞬间变成天上半明半暗的云。
    后来我才知道,生活就是个缓慢受锤的过程...
    可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了我。
    --《黄金时代》 王小波
    
  • 相关阅读:
    CENTOS7下安装REDIS
    金融量化之tushare模块的使用
    fiddler抓包出现错误 creation of the root certificate was not successful
    matplotlib学习
    Android-消息处理学习总结(Handler,Looper)
    Android-View的绘制源码学习总结
    数据库练习
    编译原理实验一
    图形学
    资源分配(分组背包)
  • 原文地址:https://www.cnblogs.com/pengxingsong/p/5882906.html
Copyright © 2020-2023  润新知