Sql server 使用MS SQL的表中用户名和密码字段的约束

Sql server 使用MS SQL的表中用户名和密码字段的约束,sql-server,database,passwords,password-policy,Sql Server,Database,Passwords,Password Policy,我希望对我的表“Administrator”中的密码字段设置一个约束条件。我希望的约束条件是密码不应少于6个字符,并且应具有混合字符(数字+数字) 此约束的关键字是什么?语法是什么。我有一段时间谷歌编辑,我在我的办公室,我必须尽快完成这项任务。我正在使用MS SQL 这是我写的 CREATE TABLE Administrators ( Id int NOT NULL IDENTITY(1,1) PRIMARY KEY, UserName varchar(255) NOT NULL, Pa

我希望对我的表“Administrator”中的密码字段设置一个约束条件。我希望的约束条件是密码不应少于6个字符,并且应具有混合字符(数字+数字)

此约束的关键字是什么?语法是什么。我有一段时间谷歌编辑,我在我的办公室,我必须尽快完成这项任务。我正在使用MS SQL

这是我写的

CREATE TABLE Administrators
(
 Id int NOT NULL IDENTITY(1,1) PRIMARY KEY,
 UserName varchar(255) NOT NULL,
 PassWord varchar(255) NOT NULL,
 Email varchar(255) NOT NULL
);

如果您绝对必须在DB层上进行此验证,并且不关心密码是否存储为纯文本,请使用。它将使您能够最大限度地控制如何接受或拒绝密码。你也可以使用Shantanu Gupta的策略。同样,如果你不介意密码以明文形式存储的话

现在,正确的做法是在应用程序的业务逻辑层中进行验证,并将密码存储为散列


但是,由于您在评论中提到,您不想承担学习触发器如何工作或将应用程序划分为逻辑层的负担,因此您始终可以在客户端上进行验证。这是非常错误的
,但是如果你不愿意学习正确的方法来做事情,并且你可以放心地向客户销售便宜的应用程序,那么它可能是你正在寻找的替代方案。

你可以在表上设置一个检查约束,并且验证逻辑可以封装在UDF中。这样,您可以随时更改逻辑

    CREATE TABLE CheckTbl (col1 varchar(20), col2 varchar(20));

    CREATE FUNCTION CheckPassword(@pass varchar(20))
    RETURNS int
    AS 
    BEGIN
       DECLARE @retval int

        if len(@pass)>6 and PATINDEX('%[0-9]%', @pass) >0 and PATINDEX('%[a-zA-Z]%', @pass) >0
        SET @retval = 1
        else
        SET @retval = 0

       RETURN @retval
    END;

ALTER TABLE CheckTbl
ADD CONSTRAINT CheckPasswordRules CHECK (dbo.CheckPassword(col1) >= 1 );
测试用例

insert into CheckTbl (col1, col2) values('as33dasd', '') --success
insert into CheckTbl (col1, col2) values('33sdasd', '') --success
insert into CheckTbl (col1, col2) values('sdasd22', '') --success
insert into CheckTbl (col1, col2) values('33dasd', '') --fail requires length >6

我会把这个逻辑放在其他地方,然后传递/存储一个正确的哈希版本的密码。你存储的密码是错误的。我不在乎你的系统有多“简单”和“小”,不好的做法仍然是不好的做法,如果你从不费心学习正确的方法,你总是会做错事。从现在开始。首先,您需要让应用程序进行检查和散列。如果这是绝对禁止的,那么,知道这样做是错误的,使用答案中列出的检查,然后查看。对于PBKDF2-HMAC-SHA-512,将密码更改为二进制(64),添加Salt二进制(16)(用于生成Salt),并将迭代次数存储到默认值10000左右。也请阅读。我正在工作的项目规模非常小,我不想现在浪费时间学习触发器,如果要求的话,可以稍后再做,所以请给出一个替代方案,这将非常感谢:)LOL除了这些艰难的方法之外,没有其他方法,这是我正在工作的POS项目,这些想法会很好,如果这是一个高规模的项目,那就太棒了。如果我可能会问,如果你的项目规模如此之小,你为什么还要为密码执行策略而烦恼呢你工作的一部分是就这类事情的最佳实践向客户提供建议。请记住,如果他们知道如何做这件事,他们可能就不会从外部聘请任何人来做这件事。仅仅因为他们“想要”,并不意味着这是正确的做法。以纯文本存储任何内容的凭据本质上是不好的——在人们开始正确操作之前,需要发生多少安全漏洞?我会质疑,为什么一开始他们就有一个天生不安全的系统是如此重要——没有必要这样做。如果我处在那个位置,我会拒绝这份工作。原因:如果在这样一个系统中出现任何与安全相关的问题,我不想让我的名字靠近它。