Невозможно проверить хеш-пароль в C#C#

Место общения программистов C#
Ответить
Anonymous
 Невозможно проверить хеш-пароль в C#

Сообщение Anonymous »

На языке C# моя цель — хешировать пароль с помощью hash_password(), а затем проверять его с помощью методов проверки(). Я хеширую и солю пароль «s3cr3t», затем проверяю два примера и возвращаю true, если пароль «s3cr3t», и возвращаю false для пароля «s3cr4t».

Код: Выделить всё

using System;
using System.Text;
using System.Security.Cryptography;

public class Pbkdf2_test4
{
public const int salt_size = 24;
public const int hash_size = 24;
public const int iteration = 100000;
static byte[] salt1 = new byte[salt_size];

private static Rfc2898DeriveBytes hash_password(string password)
{
RandomNumberGenerator generator = RandomNumberGenerator.Create();
byte[] salt = new byte[salt_size];
generator.GetBytes(salt);

salt1 = salt;

Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt1, iteration);
return pbkdf2;
}

private static bool verify(Rfc2898DeriveBytes pw_hash, string password)
{
//data1 can be a string or contents of a file.
string data1 = "Some test data";

try
{
Rfc2898DeriveBytes k1 = pw_hash;
Rfc2898DeriveBytes k2 = new Rfc2898DeriveBytes(password, salt1, iteration);

// Encrypt the data.
Aes encAlg = Aes.Create();
encAlg.Key = k1.GetBytes(16);
MemoryStream encryptionStream = new MemoryStream();
CryptoStream encrypt = new CryptoStream(encryptionStream, encAlg.CreateEncryptor(), CryptoStreamMode.Write);
byte[] utfD1 = new System.Text.UTF8Encoding(false).GetBytes(data1);

encrypt.Write(utfD1, 0, utfD1.Length);
encrypt.FlushFinalBlock();
encrypt.Close();
byte[] edata1 = encryptionStream.ToArray();
k1.Reset();

// Try to decrypt, thus showing it can be round-tripped.
Aes decAlg = Aes.Create();
decAlg.Key = k2.GetBytes(16);
decAlg.IV = encAlg.IV;
MemoryStream decryptionStreamBacking = new MemoryStream();
CryptoStream decrypt = new CryptoStream(decryptionStreamBacking, decAlg.CreateDecryptor(), CryptoStreamMode.Write);
decrypt.Write(edata1, 0, edata1.Length);
decrypt.Flush();
decrypt.Close();
k2.Reset();
string data2 = new UTF8Encoding(false).GetString(decryptionStreamBacking.ToArray());

if (!data1.Equals(data2))
{
return false;
}
else
{
return true;
}
}
catch (Exception e)
{
return false;
}
}
public static void Run()
{
Rfc2898DeriveBytes pw_hash = hash_password("s3cr3t");
Console.WriteLine(System.Text.Encoding.UTF8.GetString(pw_hash.GetBytes(hash_size)));

var result1 = verify(pw_hash, "s3cr3t");
Console.WriteLine(result1);

var result2 = verify(pw_hash, "s3cr4t");
Console.WriteLine(result2);
}
}
Мой вопрос: каким-то образом возникла проблема: функцияverify(pw_hash, "s3cr3t") возвращает false, однако должна возвращать true. В проверке() есть проблема, но я до сих пор не могу понять, потому что я даю ключам k1 и k2 true, но все равно не получаю хэш/соль, как я могу решить эту проблему?
Помимо этого, нужно ли мне что-нибудь добавить, чтобы сделать хранение паролей более безопасным?


Подробнее здесь: https://stackoverflow.com/questions/726 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»