将 SQL 结果从 Hash 转换为 Varchar
Convert SQL result from Hash to Varchar
我在 SQL table 中有一些数据是散列的,我试图将这些变量转换回字符串,但是我得到的一切都是乱码。
我已经尝试了 Stack Overflow 上的所有建议,包括删除所有连续的双零“00”。
我不知道未经哈希处理的变量是什么样的,但我认为它将是一个字符串变量。我们怎么知道从哪里开始确定首先将哪种哈希应用于该字段?
非常感谢任何帮助或指导。
到目前为止我的尝试是:
SELECT CASE WHEN LEN(0x00007041673F000000007041B2060000) > 0 THEN
convert(varchar(max),
convert(varbinary(max),
REPLACE(
convert(varchar(max),0x00007041673F000000007041B2060000, 1)
,'00',''
)
,1)
,1)
ELSE '' END
,CONVERT(varbinary(64),0x00007041673F000000007041B2060000, 1)
,CONVERT(varchar(64), 0x00007041673F000000007041B2060000, 1)
,CONVERT(varchar(64), 0x00007041673F000000007041B2060000, 2)
--Other Hash Variables-
--0x00007041673F000000007041B2060000
--0x0000C84271EB0000
--0x0000C842683F0000
--0x0000C842693F0000
--0x0000C842703F00000000C842775A0200
--0x0000A041873F00000000A041F9050000
--0x0000C842264000000000C842F04F0100
--0x000034427C400000000034426E4A0000
编辑 - 还尝试在 SQL- 上进行 BASE64 解码
https://dba.stackexchange.com/questions/191273/decode-base64-string-natively-in-sql-server
SELECT
CONVERT
(
VARCHAR(MAX),
CAST('' AS XML).value('xs:base64Binary(sql:column("BASE64_COLUMN"))', 'VARBINARY(MAX)')
) AS RESULT
FROM
(
SELECT '0x00007041673F000000007041B2060000' AS BASE64_COLUMN
) A
如果它真的是哈希值,那么你将无法将它转换回来。
大多数散列算法都设计为在有限时间内无法逆转过程,即解密数据的过程与破解某人的密码同样昂贵。
您可以在下面的讨论中找到更多详细信息:
https://security.stackexchange.com/questions/11717/why-are-hash-functions-one-way-if-i-know-the-algorithm-why-cant-i-calculate-t
如果这确实是一个散列值,则没有现实的机会将该值恢复为它的值。
但是,看看您的值,我怀疑这些值是否真的是哈希值。获得如此接近的二进制表示是非常不寻常的。尝试对任何值使用任何哈希函数。你不会得到如此相似的结果...
在不了解您的需求的情况下,您可能会尝试将二进制值作为任何(16 字节?)类型或更小类型的链。这里我使用 BIGINT
(两个 8 字节值),您可以尝试 UNIQUEIDENTIFIER
,或者您可以将其视为 16 个 1 字节值的链、8 个 2 字节值的链或任何其他可行的解释。
DECLARE @tbl TABLE(YourBinary VARBINARY(MAX));
INSERT INTO @tbl VALUES
--Other Hash Variables-
(0x00007041673F000000007041B2060000)
,(0x0000C84271EB0000 )
,(0x0000C842683F0000 )
,(0x0000C842693F0000 )
,(0x0000C842703F00000000C842775A0200)
,(0x0000A041873F00000000A041F9050000)
,(0x0000C842264000000000C842F04F0100)
,(0x000034427C400000000034426E4A0000);
SELECT DATALENGTH(YourBinary) AS TheByteLength
,CAST(YourBinary AS UNIQUEIDENTIFIER) AS CastedToGuid
,A.*
,CAST(A.Left8 AS BIGINT) AS Left8_Bigint
,CAST(A.Right8 AS BIGINT) AS Right8_Bigint
FROM @tbl
CROSS APPLY(SELECT CONVERT(BINARY(8),LEFT(YourBinary,8),0) AS Left8
,CASE WHEN DATALENGTH(YourBinary)=16 THEN CONVERT(BINARY(8),RIGHT(YourBinary,8),0) END AS Right8) A;
一个猜测:这可能是两个数字的组合键。可能是租户和二进制组合中的 table 键。很明显,这些值由非常相似的数字组成。那些有 16 个字节的包括相当接近的值。
Left8_Bigint Right8_Bigint
123426207367168 123427461922816
220187704623104 NULL
220187542355968 NULL
220187559133184 NULL
220187676573696 220187795784192
176203302371328 176205211172864
220186435125248 220189825106176
57460157054976 57459922829312
告诉我们更多关于您的问题的背景可能会有所帮助...
更新
将其作为 4 字节整数值链 returns 相当有趣的结果:
SELECT CAST(Byte4_1 AS INT)
,CAST(Byte4_2 AS INT)
,CAST(Byte4_3 AS INT)
,CAST(Byte4_4 AS INT)
FROM @tbl
CROSS APPLY(SELECT CONVERT(BINARY(4),LEFT(YourBinary,4),0) AS Byte4_1
,CONVERT(BINARY(4),SUBSTRING(YourBinary,5,4),0) AS Byte4_2
,CONVERT(BINARY(4),SUBSTRING(YourBinary,9,4),0) AS Byte4_3
,CONVERT(BINARY(4),SUBSTRING(YourBinary,13,4),0) AS Byte4_4) A;
结果
int1 int2 int3 int4
28737 1732182016 28737 -1308229632
51266 1911226368 0 0
51266 1748959232 0 0
51266 1765736448 0 0
51266 1883176960 51266 2002387456
41025 -2025914368 41025 -117112832
51266 641728512 51266 -263257856
13378 2084569088 13378 1850343424
int1和int3好像是同一个值。这指向任何类型的组合键...
我在 SQL table 中有一些数据是散列的,我试图将这些变量转换回字符串,但是我得到的一切都是乱码。
我已经尝试了 Stack Overflow 上的所有建议,包括删除所有连续的双零“00”。
我不知道未经哈希处理的变量是什么样的,但我认为它将是一个字符串变量。我们怎么知道从哪里开始确定首先将哪种哈希应用于该字段?
非常感谢任何帮助或指导。
到目前为止我的尝试是:
SELECT CASE WHEN LEN(0x00007041673F000000007041B2060000) > 0 THEN
convert(varchar(max),
convert(varbinary(max),
REPLACE(
convert(varchar(max),0x00007041673F000000007041B2060000, 1)
,'00',''
)
,1)
,1)
ELSE '' END
,CONVERT(varbinary(64),0x00007041673F000000007041B2060000, 1)
,CONVERT(varchar(64), 0x00007041673F000000007041B2060000, 1)
,CONVERT(varchar(64), 0x00007041673F000000007041B2060000, 2)
--Other Hash Variables-
--0x00007041673F000000007041B2060000
--0x0000C84271EB0000
--0x0000C842683F0000
--0x0000C842693F0000
--0x0000C842703F00000000C842775A0200
--0x0000A041873F00000000A041F9050000
--0x0000C842264000000000C842F04F0100
--0x000034427C400000000034426E4A0000
编辑 - 还尝试在 SQL- 上进行 BASE64 解码 https://dba.stackexchange.com/questions/191273/decode-base64-string-natively-in-sql-server
SELECT
CONVERT
(
VARCHAR(MAX),
CAST('' AS XML).value('xs:base64Binary(sql:column("BASE64_COLUMN"))', 'VARBINARY(MAX)')
) AS RESULT
FROM
(
SELECT '0x00007041673F000000007041B2060000' AS BASE64_COLUMN
) A
如果它真的是哈希值,那么你将无法将它转换回来。
大多数散列算法都设计为在有限时间内无法逆转过程,即解密数据的过程与破解某人的密码同样昂贵。
您可以在下面的讨论中找到更多详细信息: https://security.stackexchange.com/questions/11717/why-are-hash-functions-one-way-if-i-know-the-algorithm-why-cant-i-calculate-t
如果这确实是一个散列值,则没有现实的机会将该值恢复为它的值。
但是,看看您的值,我怀疑这些值是否真的是哈希值。获得如此接近的二进制表示是非常不寻常的。尝试对任何值使用任何哈希函数。你不会得到如此相似的结果...
在不了解您的需求的情况下,您可能会尝试将二进制值作为任何(16 字节?)类型或更小类型的链。这里我使用 BIGINT
(两个 8 字节值),您可以尝试 UNIQUEIDENTIFIER
,或者您可以将其视为 16 个 1 字节值的链、8 个 2 字节值的链或任何其他可行的解释。
DECLARE @tbl TABLE(YourBinary VARBINARY(MAX));
INSERT INTO @tbl VALUES
--Other Hash Variables-
(0x00007041673F000000007041B2060000)
,(0x0000C84271EB0000 )
,(0x0000C842683F0000 )
,(0x0000C842693F0000 )
,(0x0000C842703F00000000C842775A0200)
,(0x0000A041873F00000000A041F9050000)
,(0x0000C842264000000000C842F04F0100)
,(0x000034427C400000000034426E4A0000);
SELECT DATALENGTH(YourBinary) AS TheByteLength
,CAST(YourBinary AS UNIQUEIDENTIFIER) AS CastedToGuid
,A.*
,CAST(A.Left8 AS BIGINT) AS Left8_Bigint
,CAST(A.Right8 AS BIGINT) AS Right8_Bigint
FROM @tbl
CROSS APPLY(SELECT CONVERT(BINARY(8),LEFT(YourBinary,8),0) AS Left8
,CASE WHEN DATALENGTH(YourBinary)=16 THEN CONVERT(BINARY(8),RIGHT(YourBinary,8),0) END AS Right8) A;
一个猜测:这可能是两个数字的组合键。可能是租户和二进制组合中的 table 键。很明显,这些值由非常相似的数字组成。那些有 16 个字节的包括相当接近的值。
Left8_Bigint Right8_Bigint
123426207367168 123427461922816
220187704623104 NULL
220187542355968 NULL
220187559133184 NULL
220187676573696 220187795784192
176203302371328 176205211172864
220186435125248 220189825106176
57460157054976 57459922829312
告诉我们更多关于您的问题的背景可能会有所帮助...
更新
将其作为 4 字节整数值链 returns 相当有趣的结果:
SELECT CAST(Byte4_1 AS INT)
,CAST(Byte4_2 AS INT)
,CAST(Byte4_3 AS INT)
,CAST(Byte4_4 AS INT)
FROM @tbl
CROSS APPLY(SELECT CONVERT(BINARY(4),LEFT(YourBinary,4),0) AS Byte4_1
,CONVERT(BINARY(4),SUBSTRING(YourBinary,5,4),0) AS Byte4_2
,CONVERT(BINARY(4),SUBSTRING(YourBinary,9,4),0) AS Byte4_3
,CONVERT(BINARY(4),SUBSTRING(YourBinary,13,4),0) AS Byte4_4) A;
结果
int1 int2 int3 int4
28737 1732182016 28737 -1308229632
51266 1911226368 0 0
51266 1748959232 0 0
51266 1765736448 0 0
51266 1883176960 51266 2002387456
41025 -2025914368 41025 -117112832
51266 641728512 51266 -263257856
13378 2084569088 13378 1850343424
int1和int3好像是同一个值。这指向任何类型的组合键...