将 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好像是同一个值。这指向任何类型的组合键...