Odpowiedz

25

Kolumna PasswordSalt nie jest używana, ale solenie jest używane podczas tworzenia hashowanego hasła, które jest przechowywane w polu Hasło. Możesz to zobaczyć, jeśli spojrzysz na kod źródłowy dla SimpleMembershipProvider: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/3a669e7112e7#src%2fWebMatrix.WebData%2fSimpleMembershipProvider.cs

Sprawdź metodę CreateUserAndAccount. Wykorzystuje metodę Crypto.HashPassword:

/* ======================= 
    * HASHED PASSWORD FORMATS 
    * ======================= 
    * 
    * Version 0: 
    * PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations. 
    * (See also: SDL crypto guidelines v5.1, Part III) 
    * Format: { 0x00, salt, subkey } 
    */ 

    public static string HashPassword(string password) 
    { 
     if (password == null) 
     { 
      throw new ArgumentNullException("password"); 
     } 

     // Produce a version 0 (see comment above) password hash. 
     byte[] salt; 
     byte[] subkey; 
     using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount)) 
     { 
      salt = deriveBytes.Salt; 
      subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength); 
     } 

     byte[] outputBytes = new byte[1 + SaltSize + PBKDF2SubkeyLength]; 
     Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize); 
     Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength); 
     return Convert.ToBase64String(outputBytes); 
    } 

Zasadniczo w celu rozwiązania problemu, to jest tak bezpieczne, jak to musi być bez konieczności iść do jakiegokolwiek dodatkowego kłopoty.

+0

Hmm, więc dlaczego jest tam kolumna solna?Jeśli kolumna soli jest przydatna, jakie są możliwe scenariusze, które możemy zrobić? – jonprasetyo

+0

@jonprasetyo Nie wiem. Domyślam się, że została przeniesiona z poprzednich schematów dostawców i nie spadła, gdy podjęto decyzję o włączeniu soli do haszyszu i przechowywaniu jej w jednym miejscu. –

2

Cytat z documentation:

przez projekt, klasa SimpleMembershipProvider nie implementuje pełen zakres funkcjonalności, które są możliwe w członkostwa ASP.NET dostawców, jak zdefiniowane w klasie MembershipProvider, który jest używany przez wszystkich dostawców członkostwa ASP.NET. Niektórzy członkowie są dostępni w klasie , ponieważ są dziedziczeni z klasy podstawowej, ale wyrzucą wyjątek, jeśli uzyskasz do nich dostęp.

Jeśli witryna wymaga pełnej zdolności dostawcy członkostwa, można pominąć inicjalizacji systemu Web Pages członkostwa (które jest, nie nazywaj WebSecurity.InitializeDatabaseConnection()) i zamiast upewnić się, że średnia członków i rola włączeni są dostawcy . W takim przypadku wywołania, które należy wykonać w klasie SimpleMembershipProvider , są przekazywane do standardowego dostawcy (który jest nazywany poprzednim dostawcą w dokumentacji klasy SimpleMembershipProvider). Aby uzyskać więcej informacji, zobacz Zobacz Konfigurowanie aplikacji ASP.NET do używania członkostwa.

Pole PasswordSalt jest jedną z tych kolumn. Jeśli spojrzeć na kod źródłowy SimpleMembershipProvider można zauważyć, że kolumna PasswordSalt jest po prostu ustawiona na string.Empty:

if (database.Execute("INSERT INTO [" + MembershipTableName + "] (UserId, [Password], PasswordSalt, IsConfirmed, ConfirmationToken, CreateDate, PasswordChangedDate, PasswordFailuresSinceLastSuccess) VALUES (@0, @1, @2, @3, @4, @5, @5, @6)", new object[] { num, str, string.Empty, !requireConfirmationToken, obj3, DateTime.UtcNow, num2 }) != 1) 
{ 
    throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); 
} 

Więc jeśli chcesz go używać można napisać dostawcę członkostwa niestandardowych, który zastępuje domyślny i sam wygeneruj PasswordSalt. Można zastąpić metodę CreateAccount.

+0

Darin, ale kolumna Hasło zawiera haszowane hasło. Z jakiej soli korzysta Microsoft? adres Mac? – ilans

Powiązane problemy