密码需要带特殊字符(二)

此篇博文是这篇密码需要带特殊字符的升级篇,前一篇的存储过程产生的密码随机数,有可能一个随机数就包含有过多的特殊字符,而且第一个字符就有可能是特殊字符。

因此产生此篇,随机密码首字符不能为数字与特殊字符但必须包含且只有一个特殊字符。

另外还修正了特殊字符集长度问题,使用特殊字符集长度减一(LEN(@SpecialCharacter) - 1) 这样当你增减特殊字符集时,再不需多次地方一同修改。

修正前:

SUBSTRING( @SpecialCharacterCONVERT( TINYINT, ROUND( RAND()  *  6  +  1, 0)), 1)

 

修正后:

SUBSTRING( @SpecialCharacterCONVERT( TINYINT, ROUND( RAND()  * ( LEN( @SpecialCharacter-  1+  1, 0)), 1)

 

完整的存储过程,仅供参考。

ExpandedBlockStart.gif usp_RandomPassword
ALTER  PROCEDURE  [ dbo ]. [ usp_RandomPassword ] 
(
    @Length  INT  =  8
)
AS
BEGIN  
     DECLARE  @RandomPassword  NVARCHAR( MAX= N '' 
     DECLARE  @SpecialCharacter  NVARCHAR( 255= N ' @#$%&*? '   -- 特殊字符集
     DECLARE  @HasSpcCht  BIT  =  0   -- 判断产生的随机数是否有包含随机数
     DECLARE  @L  INT  =  1  
    
     DECLARE  @R  TINYINT, @R1  TINYINT, @R2  TINYINT     
     WHILE   @L  <=  @Length  -- 循环密码长度,每一位字符将随机产生
     BEGIN
         IF  @L  =  1  -- 随机数第一位只为字母,大写或小写
         BEGIN
             SET  @R  =  ROUND( RAND()  *  10)            
             SET  @RandomPassword  =  @RandomPassword  +  CASE  @R
             WHEN  0  THEN  CHAR( ROUND( RAND()  *  25  +  97, 0))
             WHEN  1  THEN  CHAR( ROUND( RAND()  *  25  +  65, 0))        
             END                
         END    
         ELSE   
         BEGIN            
             IF  @L  =  @Length  AND  @HasSpcCht  =  0   -- 当最后一位时,如果没有产生过特殊字符,那为随机数产生一个。
             BEGIN
                 SET  @RandomPassword  =  @RandomPassword  +  SUBSTRING( @SpecialCharacterCONVERT( TINYINT, ROUND( RAND()  * ( LEN( @SpecialCharacter-  1+  1, 0)), 1)
                 SET  @HasSpcCht  =  1
             END
             ELSE
             BEGIN
                 SET  @R1  =  ROUND( RAND()  *  30
                 IF  @R1  =  0
                     SET  @RandomPassword  =  @RandomPassword  +  CHAR( ROUND( RAND()  *  25  +  97, 0))
                    
                 IF  @R1  =  1 
                     SET  @RandomPassword  =  @RandomPassword  +  CHAR( ROUND( RAND()  *  25  +  65, 0))
                    
                 IF  @R1  =  2 
                     SET  @RandomPassword  =  @RandomPassword  +  CHAR( ROUND( RAND()  *  9  +  48, 0))    
                                
                 IF  @R1  =  3   -- 随机产生特殊字符
                 BEGIN    
                     IF  @HasSpcCht  =  0   -- 如果没有产生过,那为随机数产生一个。
                     BEGIN
                         SET  @RandomPassword  =  @RandomPassword  +  SUBSTRING( @SpecialCharacterCONVERT( TINYINT, ROUND( RAND()  * ( LEN( @SpecialCharacter-  1+  1, 0)), 1)
                         SET  @HasSpcCht  =  1
                     END                
                     ELSE   -- 如果已经产生过特殊字符,只循环产生字母,或数字
                     BEGIN  
                         SET  @R2  =  ROUND( RAND()  *  20
                         SET  @RandomPassword  =  @RandomPassword  +  CASE  @R2
                         WHEN  0  THEN  CHAR( ROUND( RAND()  *  25  +  97, 0))
                         WHEN  1  THEN  CHAR( ROUND( RAND()  *  25  +  65, 0))    
                         WHEN  2  THEN  CHAR( ROUND( RAND()  *  9  +  48, 0))    
                         END    
                     END                
                 END
             END
         END        
        
         SET  @L  =  @L  +  1   -- 随机产生一位,随机数位数加一位。
     END    
     SELECT  @RandomPassword
END

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值