无法将值(非列)从十六进制转换为 Base64 [重复]

问题描述 投票:0回答:1

我见过很多与关键词匹配的例子。然而,这些通常用于其他语言和/或来自

select
的值的转换,我无法适应我的情况。

我正在将 C# 中的哈希字符串转换为 Base64(之前它存储为十六进制)。正如 the fiddle 所示,十六进制结果正是以下 SQL 产生的结果。

declare @Pass as varchar(max) = 'abc'
declare @HexPass as varchar(max) = convert(varchar(max), hashbytes('SHA2_512', @Pass), 2)
select @Pass as Plain, @HexPass as HEX

但是,当用新的

Convert.ToHexString(hash)
替换旧的
Convert.ToBase64String(hash)
时,输出会发生变化,我还没有找到在 SQL 中引入相应转换的方法。

string text = "abc";
string expectedResult = "3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==";

byte[] data = Encoding.UTF8.GetBytes(text);
byte[] hash = SHA512.Create().ComputeHash(data);
string actualResult = Convert.ToBase64String(hash);
Console.WriteLine(expectedResult == actualResult ? "equal": "not equal");

在研究过程中,我在几个实例中偶然发现了一个依赖于

xs:base64Binary
的解决方案(例如这里这里绝对在这里等)。

但是,我无法弄清楚如何遵循上面应用

@HexPass
的语法。我尝试过“无数”的事情,在该模式表达式中连接字符串,替换其中的一部分等等。

sql sql-server base64 hex string-conversion
1个回答
2
投票

您的 C# 代码正在使用

Encoding.UTF8.GetBytes

你可以使用

declare @Pass as nvarchar(max) = N'abc' 

select 
cast('' as xml).value(
    'xs:base64Binary(sql:column("v.col"))', 'varchar(max)'
) as Base64Encoding
from (values(hashbytes('SHA2_512', CAST(@Pass COLLATE Latin1_General_100_CI_AI_SC_UTF8  AS VARCHAR(MAX))))) v(col)

这回来了

3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==

Latin1_General_100_CI_AI_SC_UTF8
对于
abc
没有任何区别,但可以用于其他字符串

© www.soinside.com 2019 - 2024. All rights reserved.