Saturday, August 04, 2007 - Posts

KB-Super Simple Default Password Generator

跟同事討論到新建帳號時如何隨機產生預設密碼,寄給申請人於第一次登入使用。這組密碼有幾個要求:

1.避免涉及申請者生日、電話之類會被猜中的資料。
2.產生的規則必須無法被掌握。
3.要符合某些優質密碼的要求(例如: 長度限制、必須英數字交雜)
4.產生的邏輯愈簡單愈好(花兩個工作天寫這種雞毛蒜皮的小東西未必太奢侈了?)

以前有看過有人寫了近百行Code用亂數及XOR完成這項工作,我原本只想用一行.NET Guid.NewGuid()打死,沒想到為了100%符合"優質"密碼的要求,還是花了五行才搞定,不過應該夠簡單囉!! Check It Out!

string randPwd = "";
do
{
    randPwd = Guid.NewGuid().ToString().Substring(0, 8).ToUpper();
} 
while ( System.Text.RegularExpressions.Regex.IsMatch(randPwd, "\\d{8}") //全數字
        || !System.Text.RegularExpressions.Regex.IsMatch(randPwd, "\\d") //全英文
        ); 
//用迴圈是防止得到的八碼全是數字(機率為100^4/256^4)或全是英文(25^4/256^4)

Updated @ 2007-08-04

Steve 很熱心地扮演了奧客,又加了兩條要求: 中英文要交雜及英文要有的大寫有的小寫! 還好還好,還是可以六行打死! RegEx 好棒呀~~

string randPwd = "";
do{    
    randPwd = Guid.NewGuid().ToString().Substring(0, 8).ToUpper();
} while ( !System.Text.RegularExpressions.Regex.IsMatch(randPwd, 
"\\d+[A-F]+\\d+[A-F]") );
//具有兩個以上的英文字母,並且中間夾數字才算合格
//將第二個英文字母變小寫
int p = Regex.Matches(randPwd, "[A-F]")[1].Index;
randPwd = randPwd.Insert(p, randPwd[p].ToString().ToLower()).Remove(p+1, 1);
TOOL-UrlEncode Function For SQL Server (Support Unicode)

朋友想在SQL Server中進行UrlEncode,原本想用SQLCLR包System.Web.HttpUtility.UrlEncode,但似乎SQLCLR裡不能匯入System.Web[],後來雖然找到了Peter DeBetta用T-SQL寫的UrlEncode UDF,但處理中文有問題。

一時技癢,就改寫出以下的UDF,最大的改良是可以將Unicode文字轉成%unnnn的格式。

有需要的朋友可以參考看看(SQL 2000也可以用)。 

-- =============================================
-- Author:        Jeffrey Lee
-- Create date: 2007-08-03
-- Description:    Provide UrlEncode function in SQL Server
-- =============================================
CREATE FUNCTION UrlEncode
(
    @Param NVARCHAR(2000)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @HexStr VARCHAR(MAX)
    --Use system function to convert input string to hex string
    SET @HexStr = master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(MAX), @Param))
    --Remove the starting '0x'
    SET @HexStr = RIGHT(@HexStr, LEN(@HexStr)-2)
    --Declare required variables
    DECLARE @I INT, @Len INT
    DECLARE @Output VARCHAR(MAX), @S CHAR(4), @C CHAR(1)
    DECLARE @LoByte TINYINT, @HiByte TINYINT
    --Get length
    SET @Len=LEN(@HexStr)/4
    --Start with first character
    SET @I=0
    --Prepare the output string
    SET @Output=''
    WHILE @I<@Len
        BEGIN
        SET @S=SUBSTRING(@HexStr, @I*4 + 1, 4)
        IF RIGHT(@S, 2)='00'
            BEGIN
            --Try to convert 2 hex digits to char
            SET @LoByte = ASCII(SUBSTRING(@S, 2, 1)) - 48
            IF @LoByte>10 SET @LoByte = @LoByte - 39 --0x61'a'-> 10
            SET @HiByte = ASCII(SUBSTRING(@S, 1, 1)) - 48
            IF @HiByte>10 SET @HiByte = @HiByte - 39
            SET @C=CHAR(@LoByte + @HiByte * 16)
            --If it's a reserved character, don't encode
            IF @C LIKE '[A-Za-z0-9()''*-._! ]'
                SET @Output = @Output + @C 
            ELSE
                SET @Output = @Output + '%' + LEFT(@S, 2)
            END
        ELSE
            SET @Output = @Output + '%u' + RIGHT(@S, 2) + LEFT(@S, 2)
        --Move to next hex 
        SET @I = @I + 1
        END
    
RETURN @Output
END

註: 從來Google到有人想出手動載入System.Web的方法可以克服此問題。

Search

Go

<August 2007>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
【工商服務】


BlogLook Score and Rank

Syndication