触发器计算 HASHBYTES 错误,但为什么?

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

我创建了一个彩虹表,应该使用触发器生成密码的哈希值。 如果我测试以下 SQL 语句一切正常:

SELECT  HASHBYTES('MD2', '123456') AS [MD2],
        HASHBYTES('MD4', '123456') AS [MD4],
        HASHBYTES('MD5', '123456') AS [MD5],
        HASHBYTES('SHA', '123456') AS [SHA],
        HASHBYTES('SHA1', '123456') AS [SHA1],
        /* 2012 only: */
        HASHBYTES('SHA2_256', '123456') AS [SHA2_256],
        HASHBYTES('SHA2_512', '123456') AS [SHA2_512];
MD2 MD4 MD5 SHA1 SHA2_256 SHA2_512
0xD4541250B586296FCCE5DEA4463AE17F 0x585028AA0F794AF812EE3BE8804EB14A 0xE10ADC3949BA59ABBE56E057F20F883E 0x7C4A8D09CA3762AF61E59520943DC26494F8941B 0x7C4A8D09CA3762AF61E59520943DC26494F8941B 0x8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92 0xBA3253876AED6BC22D4A6FF53D8406C6AD864195ED144AB5C87621B6C233B548BAEAE6956DF346EC8C17F5EA10F35EE3CBC514797ED7DDD3145464E2A0BAB413

彩虹桌:

CREATE TABLE [dbo].[RainbowTable](
    [ID] [nvarchar](50) NOT NULL,
    [Password] [nvarchar](50) NOT NULL,
    [MD5] [varbinary](16) NULL,
    [SHA1] [varbinary](20) NULL,
    [SHA256] [varbinary](32) NULL,
    [SHA512] [varbinary](64) NULL,
    [Password2] [nvarchar](50) NULL,
 CONSTRAINT [PK_RainbowTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Password2 栏用于调试触发器。 触发点:

USE [RainbowTableDB]
GO
/****** Object:  Trigger [dbo].[triggerInsertIntoRainBowTable]    Script Date: 12.04.2024 17:07:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE OR ALTER TRIGGER [dbo].[triggerInsertIntoRainBowTable] 
   ON  [dbo].[RainbowTable]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF (NOT EXISTS (SELECT * FROM Inserted))
         RETURN;

    -- Insert statements for trigger here
    Update RainbowTable SET MD5 = HASHBYTES(N'MD5', i.[Password]),
                SHA1 = HASHBYTES(N'SHA1', i.[Password]),
                SHA256 = HASHBYTES(N'SHA2_256', i.[Password]),
                SHA512 = HASHBYTES(N'SHA2_512', i.[Password]),
                Password2 = i.[Password]
    FROM RainbowTable e
    INNER JOIN inserted i ON i.ID = e.ID
    WHERE i.ID = e.ID
END

我输入密码

INSERT INTO RainbowTable (ID, [Password]) VALUES (NEWID(), '123456')

但是触发的结果是

身份证 密码 MD5 SHA1 SHA256 SHA512
0350AE7F-1A7B-40D4-B798-44ED2CAB7324 123456 0xCE0BFD15059B68D67688884D7A3D3E8C 0x6ED5833CF35286EBF8662B7B5949F0D742BBEC3F 0xEC278A38901287B2771A13739520384D43E4B078F78AFFE702DEF108774CCE24 0x0A47151A074E633AB7B6BED6AAB724ABBDDCD3250F80A06BC612A233A907805101F2441B5B2926E54CE8AC8CFBC074BB7A56748830487DF09591DBE167E800F6

一切都是错的。但为什么呢?

哈希的正确结果。

sql-server triggers sql-server-2016
1个回答
0
投票

我已将触发代码更改为这个

USE [RainbowTableDB]
GO
/****** Object:  Trigger [dbo].[triggerInsertIntoRainBowTable]    Script Date: 12.04.2024 17:07:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE OR ALTER TRIGGER [dbo].[triggerInsertIntoRainBowTable] 
   ON  [dbo].[RainbowTable]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF (NOT EXISTS (SELECT * FROM Inserted))
         RETURN;

    -- Insert statements for trigger here
    Update RainbowTable SET MD5 = HASHBYTES('MD5', CONVERT(VARCHAR, i.[PASSWORD])),
                            SHA1 = HASHBYTES('SHA1', CONVERT(VARCHAR, i.[PASSWORD])),
                            SHA256 = HASHBYTES('SHA2_256', CONVERT(VARCHAR, i.[PASSWORD])),
                            SHA512 = HASHBYTES('SHA2_512', CONVERT(VARCHAR, i.[PASSWORD]))
    FROM RainbowTable e
    INNER JOIN Inserted i ON e.ID = i.ID
END

现在可以了。

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