Членство 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);
}