zoukankan      html  css  js  c++  java
  • 密码需要带特殊字符(二)

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

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

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

    修正前:

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

    修正后:

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

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

    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
  • 相关阅读:
    c#调用dll,::CoInitialize(NULL)出错
    使用 Anthem.NET 的常见回调(Callback)处理方式小结
    主题和皮肤学习
    得到任意网页源代码 (利用WebClient和WebRequest类)
    HTML marquee标签详解
    制作一个简单的天气预报
    CSS中的类class和标识id选择符(.和#号)
    String split '.'
    Map 的 clear() 方法会清空 Map对象
    sqLite 执行查询语句时报错__及SimpleCursorAdapter
  • 原文地址:https://www.cnblogs.com/insus/p/2354453.html
Copyright © 2011-2022 走看看