我有一個現有的表有100個用戶和密碼。數據類型是一個varchar。 我剛剛創建了一個asp.net mvc應用程序,我想將密碼轉換爲aspnet_membership表。創建密碼和Passwordsalt
如何將SQL級別的varchar密碼轉換爲aspnet_membership表中的「Password」和「Passwordsalt」?
我有一個現有的表有100個用戶和密碼。數據類型是一個varchar。 我剛剛創建了一個asp.net mvc應用程序,我想將密碼轉換爲aspnet_membership表。創建密碼和Passwordsalt
如何將SQL級別的varchar密碼轉換爲aspnet_membership表中的「Password」和「Passwordsalt」?
密碼& PasswordSalt零件不在「SQL級別」中處理和創建 如果仔細查看asp.net成員資格數據庫 - 表/存儲過程/其他對象。然後你會發現有兩個存儲過程(簡稱sp)在asp.net成員數據庫表中創建用戶。
這些SP將分別創建aspnet_Membership & aspnet_Users表格內的用戶輸入。 ASP.Net成員資格適用於您設置的web.config文件設置。 一個例子默認webconfig項將是這樣的:
<authentication mode="Forms"> // If you are using Form authentication
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" passwordFormat="Encrypted" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
在此設置部分屬性「了passwordFormat」設置用戶密碼的存儲方式。 選項有 - 清除(0),散列(1),加密(2)
默認情況下,它將具有散列值 - 或者如果你還沒有指定passwordFormat。
明文密碼將被保存爲 - 文本清除 - 可讀。
隨着散列選項密碼將不會是(加密的),僅使用一個散列算法FFT
與加密的選項的密碼將被加密,然後編碼進行編碼。
加密選項u指定非自動生成的「計算機密鑰」 爲了得到一個透視:Get a non-autogenerated machine key
密碼鹽是用於加密和與驗證&解密沿着編碼密碼隨機生成的字符串鍵。
如果你想在此改變asp.net成員提供的加密方法和編碼youself,(如果使用custome會員供應商),你可以做這樣的事情:
private string EncodePassword(byte passFormat, string passtext, string passwordSalt)
{
if(passFormat.Equals(0)) // passwordFormat="Clear" (0)
return passtext;
else{
byte[] bytePASS = Encoding.Unicode.GetBytes(passtext);
byte[] byteSALT = Convert.FromBase64String(passwordSalt);
byte[] byteRESULT = new byte[byteSALT.Length + bytePASS.Length + 1];
System.Buffer.BlockCopy(byteSALT, 0, byteRESULT, 0, byteSALT.Length);
System.Buffer.BlockCopy(bytePASS, 0, byteRESULT, byteSALT.Length, bytePASS.Length);
if(passFormat.Equals(1)) // passwordFormat="Hashed" (1)
{
HashAlgorithm ha = HashAlgorithm.Create(Membership.HashAlgorithmType);
return (Convert.ToBase64String(ha.ComputeHash(byteRESULT)));
}
else // passwordFormat="Encrypted" (2)
{
MyCustomMembership myObj = new MyCustomMembership();
return(Convert.ToBase64String(myObj.EncryptPassword(byteRESULT)));
}
}
}
用法示例:
string passSalt = // Either generate a random salt for that user, or retrieve the salt from database if the user is in edit and has a password salt
EncodePassword(/* 0 or 1 or 2 */, passwordText, passSalt);
我希望這會有所幫助。
它不可能在SQL級別,但對於一些C#代碼,有兩種可行的技術。
最簡單的方法是編寫一個過程來讀取您現有的表格,併爲每個用戶調用Membership.CreateUser
,並且成員資格提供程序將爲您創建用戶記錄,其中包括密碼& salt。
或者,爲自己創建一個虛擬用戶,然後編寫一個過程將虛擬用戶的密碼更改爲現有用戶的值,然後從aspnet_membership表中讀取該值。如果您有興趣,我有代碼可以做到這一點。
HashAlgorithm ha = HashAlgorithm.Create(Membership.HashAlgorithmType);
如何檢查公頃爲空或不是,如果空手段,以及如何拋出異常
感謝明確的答案。 – Hoorayo 2010-09-20 21:08:47
當我使用默認成員創建由asp.net創建的邏輯時,asp.net如何生成passwordsalt?您提到了「如果用戶正在編輯並且密碼爲salt,那麼爲該用戶生成隨機鹽或從數據庫中檢索salt」。我只是好奇什麼是邏輯,除非我重寫默認邏輯。 – Hoorayo 2010-09-24 16:26:09
好,直到我的知識 - 密碼salt是一些隨機生成的字符串...它與散列或加密&哈希密碼一起使用。 – Jsinh 2010-09-25 08:37:00