栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > JavaScript

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

JavaScript 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

修正前:

SUBSTRINg(@SpecialCharacter, ConVERT(TINYINT,ROUND(RAND() * 6 + 1,0)),1)

 

修正后:

SUBSTRINg(@SpecialCharacter, ConVERT(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() * 1, 0)            
            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(@SpecialCharacter, ConVERT(TINYINT,ROUND(RAND() * (LEN(@SpecialCharacter) - 1) + 1,0)),1)
                SET @HasSpcCht = 1
            END
            ELSE
            BEGIN
                SET @R1 = ROUND(RAND() * 3, 0) 
                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(@SpecialCharacter, ConVERT(TINYINT,ROUND(RAND() * (LEN(@SpecialCharacter) - 1) + 1,0)),1)
                        SET @HasSpcCht = 1
                    END                
                    ELSE  --如果已经产生过特殊字符,只循环产生字母,或数字
                    BEGIN  
                        SET @R2 = ROUND(RAND() * 2, 0) 
                        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

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/245820.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号