2010-09-20 69 views
4

我有一個現有的表有100個用戶和密碼。數據類型是一個varchar。 我剛剛創建了一個asp.net mvc應用程序,我想將密碼轉換爲aspnet_membership表。創建密碼和Passwordsalt

如何將SQL級別的varchar密碼轉換爲aspnet_membership表中的「Password」和「Passwordsalt」?

回答

17

密碼& PasswordSalt零件不在「SQL級別」中處理和創建 如果仔細查看asp.net成員資格數據庫 - 表/存儲過程/其他對象。然後你會發現有兩個存儲過程(簡稱sp)在asp.net成員數據庫表中創建用戶。

  1. aspnet_Membership_CreateUser
  2. aspnet_Users_CreateUser

這些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); 

我希望這會有所幫助。

+0

感謝明確的答案。 – Hoorayo 2010-09-20 21:08:47

+0

當我使用默認成員創建由asp.net創建的邏輯時,asp.net如何生成passwordsalt?您提到了「如果用戶正在編輯並且密碼爲salt,那麼爲該用戶生成隨機鹽或從數據庫中檢索salt」。我只是好奇什麼是邏輯,除非我重寫默認邏輯。 – Hoorayo 2010-09-24 16:26:09

+0

好,直到我的知識 - 密碼salt是一些隨機生成的字符串...它與散列或加密&哈希密碼一起使用。 – Jsinh 2010-09-25 08:37:00

0

它不可能在SQL級別,但對於一些C#代碼,有兩種可行的技術。

最簡單的方法是編寫一個過程來讀取您現有的表格,併爲每個用戶調用Membership.CreateUser,並且成員資格提供程序將爲您創建用戶記錄,其中包括密碼& salt。

或者,爲自己創建一個虛擬用戶,然後編寫一個過程將虛擬用戶的密碼更改爲現有用戶的值,然後從aspnet_membership表中讀取該值。如果您有興趣,我有代碼可以做到這一點。

0
HashAlgorithm ha = HashAlgorithm.Create(Membership.HashAlgorithmType); 

如何檢查公頃爲空或不是,如果空手段,以及如何拋出異常