Hash在SQL和C#中有所不同吗?
发布时间:2020-05-24 08:54:37 所属栏目:MsSql 来源:互联网
导读:在我的数据库中我有SQL, DECLARE @InputString nvarchar(15) =passDECLARE @InputSalt nvarchar(36) = FC94C37C-03A3-49A3-9B9F-D4A82E708618DECLARE @HashThis nvarchar(100)Declare @BinaryHash varbinary(max)set
|
在我的数据库中我有SQL, DECLARE @InputString nvarchar(15) ='pass'
DECLARE @InputSalt nvarchar(36) = 'FC94C37C-03A3-49A3-9B9F-D4A82E708618'
DECLARE @HashThis nvarchar(100)
Declare @BinaryHash varbinary(max)
set @HashThis = @InputString + @InputSalt
set @BinaryHash= HASHBYTES('SHA1',@HashThis)
SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:variable("@BinaryHash")))','VARCHAR(MAX)')
和C#我有, public static string HashString(string cleartext)
{
byte[] clearBytes = System.Text.Encoding.UTF8.GetBytes(cleartext);
return HashBytes(clearBytes);
}
public static string HashBytes(byte[] clearBytes)
{
var hasher = System.Security.Cryptography.SHA1.Create();
byte[] hashBytes = hasher.ComputeHash(clearBytes);
string hash = System.Convert.ToBase64String(hashBytes);
hasher.Clear();
return hash;
}
HashString("passFC94C37C-03A3-49A3-9B9F-D4A82E708618")
但哈希是不同的? C# Output: S55Nz1lyGweoJEHWcC6zFxJDKWQ= SQL Output: 4jqyC1pLJ0hW+AMNk8GOWCC99KY= https://dotnetfiddle.net/4bwAtm 解决方法哈希函数在字节上运行,而不是在字符上运行.您可以有效地将字符转换为字节,但是您在C#中的操作方式与在SQL中的操作方式不同:您使用SQL中的nvarchar(UTF-16),使用C#中的UTF-8.您可以更改其中一个以匹配另一个.由于当前测试中没有任何非ASCII字符,因此只需将SQL中的nvarchar更改为varchar,即可轻松验证是否存在此问题.但这对于全范围的Unicode字符来说是不够的. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- mysql5.7.18解压版启动mysql服务
- sql-server – 从Sql Server 2008 R2连接到IBM i服务器
- SqlServer 2005 T-SQL Query 学习笔记(4)
- sql – 使用SELECT INTO创建一个新表并添加一个主键
- SQL SERVER 小系统单据自动生成存储过程
- FORALL循环中的多个SQL语句
- 汉明重量/人口数量在T-SQL中
- sql – 存档超过1,000,000,000行的巨大表的最佳实践
- sql – ORA-01843:不是有效月份:TO_DATE(’12 -JUN-02′,
- 详解删除SQL Server 2005 Compact Edition数据库
