【发布时间】:2022-11-21 03:41:31
【问题描述】:
我正在尝试创建一个触发器来将值从 varchar 转换为 varbinary。 触发器创建成功。但是,它不会触发插入查询。
触发代码
USE VacationManager;
GO
CREATE TRIGGER HashPassword
ON Users
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Users(Username,[Password],FirstName,LastName,RoleID)
SELECT
i.Username,
CONVERT(varbinary(max),EncryptByPassPhrase('iskam_6_za_bazata_moje_i_za_springa',i.[Password]),2) ,
i.FirstName,
i.LastName,
i.RoleID
FROM inserted AS i
END
用户表
USE [VacationManager]
GO
/****** Object: Table [dbo].[Users] Script Date: 11/20/2022 8:58:16 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Users](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Username] [varchar](255) NOT NULL,
[Password] [varbinary](max) NOT NULL,
[FirstName] [nvarchar](255) NOT NULL,
[LastName] [nvarchar](255) NOT NULL,
[RoleID] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Users] WITH CHECK ADD CONSTRAINT [FK_Users.RoleID] FOREIGN KEY([RoleID])
REFERENCES [dbo].[Roles] ([Id])
GO
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_Users.RoleID]
GO
我尝试执行此查询:
INSERT INTO Users(Username,[Password],FirstName,LastName,RoleID)
VALUES('martini','parola','martin','atanasov',4)
但结果是:
Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this query.
【问题讨论】:
-
我会问你需要能够解密这些密码?您的触发器说它正在“散列”它们,但事实并非如此;散列是一种方式。你为什么不真正对它们进行散列和加盐(最好在应用程序中)?
-
@Larnu 是的,我需要能够解密它们。我不知道散列和加密之间的区别,所以我将它命名为 hashpassword。
-
另外,您真的不应该使用可逆加密来存储密码——您应该始终对密码进行散列处理,并使用存储的散列值验证散列参数。
-
散列是“一种方式”;一旦一个值被散列,你不应该能够“取消散列”它来计算出原来的值是什么。加密设计为两种方式;当你加密某些东西时,你可以使用用于加密它的密钥来解密它,并获得原始值。如果您正在存储用户的登录凭据,以便他们可以对应用程序进行身份验证,则您不需要能够解密它。我个人怀疑您是否确实需要解密这些值;如果你是那么用户至少应该知道任何管理员可以查看他们的密码
标签: sql sql-server triggers