Членство ASP.NET соль?

как делает ASP.NET членство генерирует свой солевой ключ, а затем как они его кодируют (то есть, это соль + пароль или пароль + соль)?

Я использую ша-1 С моим членством, но я хотел бы воссоздать те же соли, чтобы встроенный членский материал мог хэшировать материал так же, как и мой материал.

Edit 2: Не обращай внимания. Я неправильно понял его и думал, что он сказал байты, а не биты. Поэтому я передавал 128 байт, а не 128 биты.

Edit: я пытался сделать это так. Вот что у меня есть,

public string EncodePassword(string password, string salt)
{
    byte[] bytes = Encoding.Unicode.GetBytes(password);
    byte[] src = Encoding.Unicode.GetBytes(salt);
    byte[] dst = new byte[src.Length + bytes.Length];

    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);

    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");

    byte[] inArray = algorithm.ComputeHash(dst);

    return Convert.ToBase64String(inArray);
}

private byte[] createSalt(byte[] saltSize)
{
    byte[] saltBytes = saltSize;

    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    rng.GetNonZeroBytes(saltBytes);

    return saltBytes;
}

поэтому я не пытался увидеть, если ASP.NET членство распознает это, но хэшированный пароль выглядит близко. Я просто не знаю, как преобразовать его в base64 для соли.

Я сделал это

byte[] storeSalt = createSalt(new byte[128]);
string salt = Encoding.Unicode.GetString(storeSalt);
string base64Salt = Convert.ToBase64String(storeSalt);

int test = base64Salt.Length;

длина теста 172 который хорошо над 128 битами так что я делаю неправильно?

это то, что их соль выглядит как

vkNj4EvbEPbk1HHW+K8y/A==

вот как выглядит моя соль

E9oEtqo0livLke9+csUkf2AOLzFsOvhkB/NocSQm33aySyNOphplx9yH2bgsHoEeR/aw/pMe4SkeDvNVfnemoB4PDNRUB9drFhzXOW5jypF9NQmBZaJDvJ+uK3mPXsWkEcxANn9mdRzYCEYCaVhgAZ5oQRnnT721mbFKpfc4kpI=

3 ответов


что такое алгоритм хэша по умолчанию, который ASP.NET членство использует? имеет хорошее обсуждение их алгоритма по умолчанию.

надеюсь, это поможет!

изменить- Ответ, на который я ссылался, - это код в верхнем сообщении,

   public string EncodePassword(string pass, string salt)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(pass);
        //byte[] src = Encoding.Unicode.GetBytes(salt); Corrected 5/15/2013
        byte[] src = Convert.FromBase64String(salt); 
        byte[] dst = new byte[src.Length + bytes.Length];
        Buffer.BlockCopy(src, 0, dst, 0, src.Length);
        Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
        HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
        byte[] inArray = algorithm.ComputeHash(dst);
        return Convert.ToBase64String(inArray);
    } 

они объединяют соль Unicode + Pass с помощью BlockCopy

-- в ответ на ваш вопрос:

оба алгоритма необходимы и выполняют разные роли...

RNG Crypto используется для генерации соли. Это в основном длинная строка случайных данных. Это генерируется и хранится на основе каждого пользователя. Обычно это делается при создании пользователя или изменении пароля.

BlockCopy-это просто метод, который они используют для объединения соли с паролем. Вышеуказанный код по существу приравнивается к salt + password.

вы не сможете воссоздать значение соли, поскольку оно полностью случайное. Он, однако, хранится для каждого пользователя фреймворком.

объединение соли с паролем и хэширование его с помощью метода выше позволит вам проверить пароли пользователей, используя хэшированное значение, хранящееся в фреймворке.

Я думаю, что мы оба читаем ваш вопрос по-разному. Код, который я опубликовал, не будет генерировать вашу соль, но он позволит вам использовать ее таким образом, который совместим с ASP.NET членство.

извините, мое объяснение не самое лучшее - это ответ на твой вопрос?


вот как SQLMembershipProvider генерирует соль.

    private string GenerateSalt() {
        var buf = new byte[16];
        (new RNGCryptoServiceProvider()).GetBytes(buf);
        return Convert.ToBase64String(buf);
   }

вы можете скачать ASP.NET код поставщика SQL здесь.

вопрос у меня был был разработки приложений работает на IIS7. .NET 4.0 использует другой алгоритм хэширования по умолчанию, чем hashalgorithmtype по умолчанию для .NET 2.0.

в примере кода "EncodePassword" от Microsoft они ссылаются на Membership.HashAlgorithmType который я считаю возвращает значение по умолчанию для базы, если это не указано в web.config.

я смог заставить этот метод GenerateSalt и EncodePassword работать для моего приложения.

мой комбинированный код:

internal string GenerateSalt()
{
    byte[] buf = new byte[16];
    (new RNGCryptoServiceProvider()).GetBytes(buf);
    return Convert.ToBase64String(buf);
}

internal string EncodePassword(string pass, int passwordFormat, string salt)
{
    if (passwordFormat == 0) // MembershipPasswordFormat.Clear
        return pass;

    byte[] bIn = Encoding.Unicode.GetBytes(pass);
    byte[] bSalt = Convert.FromBase64String(salt);
    byte[] bAll = new byte[bSalt.Length + bIn.Length];
    byte[] bRet = null;

    Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
    Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
    if (passwordFormat == 1)
    { // MembershipPasswordFormat.Hashed
        HashAlgorithm s = HashAlgorithm.Create("SHA1");
        // Hardcoded "SHA1" instead of Membership.HashAlgorithmType
        bRet = s.ComputeHash(bAll);
    }
    else
    {
        bRet = EncryptPassword(bAll);
    }
    return Convert.ToBase64String(bRet);
}

вот один из способов сделать это. Соль - это просто случайное число, вы можете использовать класс RNGCryptoServiceProvider в библиотеке framework для получения хорошего случайного числа для использования в качестве соли

private const int ITERATIONS = 10000;
private const int SALT_SIZE = 32;
private const int HASH_SIZE = 32;

public void SaltAndHashPassword(string password, out byte[] salt,
  out byte[] hash)
{
  Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(
    password,
    SALT_SIZE,
    ITERATIONS);

  salt = rdb.Salt;
  hash = rdb.GetBytes(HASH_SIZE);
}