我创建了一个彩虹表,应该使用触发器生成密码的哈希值。 如果我测试以下 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 |
一切都是错的。但为什么呢?
哈希的正确结果。
我已将触发代码更改为这个
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
现在可以了。