Respuesta

25

La columna PasswordSalt no se utiliza, pero la salazón se utiliza al crear la contraseña hash que se almacena en el campo Contraseña. Puede ver esto si observa el código fuente de SimpleMembershipProvider: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/3a669e7112e7#src%2fWebMatrix.WebData%2fSimpleMembershipProvider.cs

Compruebe el método CreateUserAndAccount. Utiliza el método 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); 
    } 

Básicamente para tratar sus preocupaciones, es tan seguro como que tiene que ser sin tener que ir a ningún problema adicional.

+0

Hmm, entonces ¿por qué hay una columna de sal?Si la columna de sal es útil, ¿cuáles son los posibles escenarios que podemos hacer? – jonprasetyo

+0

@jonprasetyo No lo sé. Mi mejor opción es que fue traída a través de los esquemas de proveedores anteriores y no se eliminó cuando se tomó la decisión de integrar la sal con el hash y almacenarla en un solo lugar. –

2

Presupuesto de la documentation:

Por diseño, la clase SimpleMembershipProvider no implementa la gama completa de funcionalidad que es posible en la suscripción de ASP.NET proveedores, como se define en la clase que se utiliza MembershipProvider por todos los proveedores de membresía de ASP.NET. Algunos miembros están disponibles en la clase porque se heredan de la clase base, pero lanzarán una excepción al si accede a ellos.

Si su sitio web requiere la plena capacidad del proveedor de pertenencia, se puede saltar la inicialización del sistema de suscripciones de páginas web (es es decir, no llame WebSecurity.InitializeDatabaseConnection()) y lugar asegurarse de que el número de miembros y el papel estándar los proveedores están habilitados . En ese caso, las llamadas que realice a la clase SimpleMembershipProvider se pasan al proveedor estándar (que se conoce como el proveedor anterior en la documentación de la clase SimpleMembershipProvider ). Para obtener más información, vea Configurar una aplicación ASP.NET para usar membresía.

El campo PasswordSalt es una de esas columnas. Si nos fijamos en el código fuente de la SimpleMembershipProvider se dará cuenta de que la columna de PasswordSalt se establece simplemente para 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); 
} 

Así que si usted quiere usarlo se podría escribir un proveedor de suscripciones personalizado que anula la opción por defecto y genere PasswordSalt usted mismo. Puede anular el método CreateAccount.

+0

Darin, pero la columna Contraseña contiene una contraseña hash. ¿Qué sal usa Microsoft? la dirección Mac? – ilans

Cuestiones relacionadas