Rfc2898derivebytes что это за хеширование
Trying to find related answer for a long time, but not convinced yet.
What I am trying is to encrypt using RijndaelManaged. To create Key, I am passing password, salt and iteration to Rfc2898DeriveBytes.
I was thinking to add constant if user entered password is below specific length before passing it to Rfc2898DeriveBytes.
So far what I found that adding constant will not add any benefit to security. Let suppose attacker get an access to database containing encrypted data along with salt, but not to constant will give him a bit harder time. Although in the end he will find that constant.
Or it is "really and extremely" safe to pass any length password to Rfc2898DeriveBytes without getting worried?
Does passing shorter or lengthier password affect key derivation process in term of which one is better and most recommended?
So far what I know that random salt and more iteration is important.
Following is the code, should I remove adding constant to password or keep it?
(Note: password length restriction to user is not applied at GUI, user can pass 1 character or even more than 10 characters)
Welcoming any positive or negative comment and responses.
The only solution is to require the user enter a password of at least a certain length. Adding a constant or more rounds isn't going to make up for a 1 character password.
yes, salt and more iterations are more important. In fact, more iterations is exactly what BCrypt does. I don't think adding constant data to make a "longer password" would make much of a difference--you're not changing the effective depth of security of the password.
Adding the constant is pointless. The salt already achieves the purpose you want the constant to fulfill. Infact, adding the constant has the potential to make secuirty worse (although I think you'll be safe with Rfc2898DeriveBytes ). If you want to improve security ensure the password excedes a minimum length.
@Jordell, Even the provided password is of just 1 character length? (please note that the length cannot be restricted at begining)
Конструкторы
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, расширяющее значение и число итераций для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя заданные пароль, случайные данные, число итераций и имя хэш-алгоритма для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль и соль для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, расширяющее значение и число итераций для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя заданные пароль, случайные данные, число итераций и имя хэш-алгоритма для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль и соль для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, размер соли и число итераций для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя заданные пароль, размер случайных данных, число итераций и имя хэш-алгоритма для формирования ключа.
Примеры
В следующем примере кода класс используется Rfc2898DeriveBytes для создания двух идентичных ключей Aes для класса. Затем он шифрует и расшифровывает некоторые данные с помощью ключей.
Свойства
Возвращает хэш-алгоритм, используемый для наследования байтов.
Возвращает или задает число итераций для данной операции.
Возвращает или задает значение соли ключа для данной операции.
Rfc2898DeriveBytes(Byte[], Byte[], Int32)
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, расширяющее значение и число итераций для формирования ключа.
Параметры
Пароль, используемый для формирования ключа.
Соль, используемая для формирования ключа.
Число итераций для данной операции.
Исключения
Размер указанного расширяющего значения менее 8 байт, а число итераций менее 1.
Пароль или расширяющее значение равны null .
Remarks
Rfc2898DeriveBytes takes a password, a salt, and an iteration count, and then generates keys through calls to the GetBytes method.
RFC 2898 includes methods for creating a key and initialization vector (IV) from a password and salt. You can use PBKDF2, a password-based key derivation function, to derive keys using a pseudo-random function that allows keys of virtually unlimited length to be generated. The Rfc2898DeriveBytes class can be used to produce a derived key from a base key and other parameters. In a password-based key derivation function, the base key is a password and the other parameters are a salt value and an iteration count.
Never hard-code a password within your source code. Hard-coded passwords can be retrieved from an assembly by using the Ildasm.exe (IL Disassembler), by using a hexadecimal editor, or by simply opening up the assembly in a text editor such as Notepad.exe.
Комментарии
Размер соли должен составлять 8 байт или больше.
RFC 2898 включает методы создания ключа и вектора инициализации (IV) из пароля и соли. Для получения ключей с помощью псевдослучайной функции, позволяющей создавать ключи практически неограниченной длины, можно использовать PBKDF2— функцию на основе пароля. Класс Rfc2898DeriveBytes можно использовать для создания производного ключа из базового ключа и других параметров. В функции формирования ключа на основе пароля базовый ключ является паролем, а другие параметры — значение соли и число итераций.
Никогда не жестко запрограммируйте пароль в исходном коде. Жестко заданные пароли можно извлечь из сборки с помощью Ildasm.exe (дизассемблировщик IL), с помощью шестнадцатеричного редактора или просто открыв сборку в текстовом редакторе, например Notepad.exe.
Комментарии
Rfc2898DeriveBytes принимает пароль, соль и число итераций, а затем создает ключи с помощью вызовов GetBytes метода.
RFC 2898 включает методы создания ключа и вектора инициализации (IV) из пароля и соли. Для получения ключей с помощью псевдослучайной функции, позволяющей создавать ключи практически неограниченной длины, можно использовать PBKDF2— функцию на основе пароля. Класс Rfc2898DeriveBytes можно использовать для создания производного ключа из базового ключа и других параметров. В функции формирования ключа на основе пароля базовый ключ является паролем, а другие параметры — значение соли и число итераций.
Никогда не жестко запрограммируйте пароль в исходном коде. Жестко заданные пароли можно извлечь из сборки с помощью Ildasm.exe (дизассемблировщик IL), с помощью шестнадцатеричного редактора или просто открыв сборку в текстовом редакторе, например Notepad.exe.
Комментарии
Размер соли должен быть 8 байт или больше, а число итераций должно быть больше нуля. Минимальное рекомендуемое число итераций — 1000.
RFC 2898 включает методы создания ключа и вектора инициализации (IV) из пароля и соли. Для получения ключей с помощью псевдослучайной функции, позволяющей создавать ключи практически неограниченной длины, можно использовать PBKDF2— функцию на основе пароля. Класс Rfc2898DeriveBytes можно использовать для создания производного ключа из базового ключа и других параметров. В функции формирования ключа на основе пароля базовый ключ является паролем, а другие параметры — значение соли и число итераций.
Никогда не жестко запрограммируйте пароль в исходном коде. Жестко заданные пароли можно извлечь из сборки с помощью Ildasm.exe (дизассемблировщик IL), с помощью шестнадцатеричного редактора или просто открыв сборку в текстовом редакторе, например Notepad.exe.
Перегрузки
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль и соль для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль и соль для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, расширяющее значение и число итераций для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, расширяющее значение и число итераций для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, размер соли и число итераций для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя заданные пароль, случайные данные, число итераций и имя хэш-алгоритма для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя заданные пароль, случайные данные, число итераций и имя хэш-алгоритма для формирования ключа.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя заданные пароль, размер случайных данных, число итераций и имя хэш-алгоритма для формирования ключа.
Комментарии
Размер соли должен составлять 8 байт или больше.
RFC 2898 включает методы создания ключа и вектора инициализации (IV) из пароля и соли. Для получения ключей с помощью псевдослучайной функции, позволяющей создавать ключи практически неограниченной длины, можно использовать PBKDF2— функцию на основе пароля. Класс Rfc2898DeriveBytes можно использовать для создания производного ключа из базового ключа и других параметров. В функции формирования ключа на основе пароля базовый ключ является паролем, а другие параметры — значение соли и число итераций.
Никогда не жестко запрограммируйте пароль в исходном коде. Жестко заданные пароли можно извлечь из сборки с помощью Ildasm.exe (дизассемблировщик IL), с помощью шестнадцатеричного редактора или просто открыв сборку в текстовом редакторе, например Notepad.exe.
Rfc2898DeriveBytes(String, Byte[])
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль и соль для формирования ключа.
Параметры
Пароль, используемый для формирования ключа.
Соль, используемая для формирования ключа.
Исключения
Размер указанного расширяющего значения менее 8 байт, а число итераций менее 1.
Пароль или расширяющее значение равны null .
1 ответ:
вы действительно не хотите использовать пароль пользователя в качестве ключа шифрования, особенно С AES.
Rfc2898DeriveBytes-это реализация PBKDF2. То, что он делает, - это многократно хэшировать пароль пользователя вместе с солью. Это имеет несколько преимуществ:
во - первых, вы можете использовать пароли произвольного размера-AES поддерживает только определенные размеры ключей.
во-вторых, добавление соли означает, что вы можете использовать тот же пароль для создайте несколько разных ключей (предполагая, что соль не является константой, как в вашем примере). Это важно для разделения ключей; повторное использование ключей в различных контекстах является одним из наиболее распространенных способов взлома криптографических систем.
несколько итераций (1000 по умолчанию) замедляют атаки угадывания пароля. Рассмотрим кого-то, кто пытается угадать ваш ключ AES. Если вы просто использовали пароль, это было бы просто - просто попробуйте каждый возможный пароль в качестве ключа. На с другой стороны, с PBKDF2 злоумышленник сначала должен выполнить 1000 итераций хэша для каждого пароль угадать. Поэтому, хотя он немного замедляет пользователя, он оказывает непропорциональное влияние на злоумышленника. (На самом деле довольно часто используется гораздо более высокое количество итераций; обычно рекомендуется 10000).
Это также означает, что конечный выходной ключ равномерно распределен. Если вы использовали пароль, например, как правило, 16 из 128 бит ключа будет 0 (высокий ASCII бит). Это сразу же делает keysearch 65536 раз проще, чем должно быть, даже игнорируя угадывание пароля.
наконец, AES имеет определенные уязвимости с соответствующими ключевыми атаками. Связанные ключевые атаки возможны, когда злоумышленник знает некоторые данные, зашифрованные несколькими ключами, и существует некоторая известная (или предполагаемая) связь между ними. Например, если вы зашифровали данные как с помощью пароля-ключа "My AES key sucks" (16 байт, для AES-128), так и с помощью "MY AES Ключ сосет", может быть возможна связанная ключевая атака. В настоящее время наиболее известные атаки фактически не позволяют нарушать полный AES таким образом, но они постепенно улучшаются с течением времени - только на прошлой неделе была опубликована новая атака, которая разбивает 13 раундов (из 14 всего) AES-256 с использованием связанной ключевой атаки. Было бы крайне неразумно полагаться на то, что такие атаки со временем не станут лучше.
См. также раздел
Примеры
В следующем примере кода класс используется Rfc2898DeriveBytes для создания двух идентичных ключей Aes для класса. Затем он шифрует и расшифровывает некоторые данные с помощью ключей.
См. также раздел
Применяется к
Examples
The following code example uses the Rfc2898DeriveBytes class to create two identical keys for the Aes class. It then encrypts and decrypts some data using the keys.
Применяется к
1 Answer 1
With an assumption that the attacker doesn't know the "constant" then, yes, it would effectively increase security by making brute force attacks harder. HOWEVER, that is a very bad assumption and you should ALWAYS assume the attacker has your source code.
Continuing on our bad assumption: You are correct that the attacker may eventually figure out your constant if enough passwords are cracked.
As to whether or not one adding more characters to your password improves key derivation: not really. The key that you generate will be the same length no matter what. But an attacker is not going to attempt to guess your key, they are too long and effectively impossible to brute force. Any attacker is going to go after the password.
This is where iterations, salt and hard to guess long passwords come in. Iterations increase difficulty by increasing the time it takes to make each guess. While the time to do thousands of iterations when a legitimate user logs in is negligible, the cost to a brute force attacker is huge. Long passwords additionally increase difficulty of brute force. The salt helps to protect identical passwords from being solved at the same time (the attacker must attack each password independently even if they are the same).
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Реализует функцию формирования ключа на основе пароля (PBKDF2) посредством генератора псевдослучайных чисел HMACSHA1.
Комментарии
Размер соли должен быть 8 байт или больше, а число итераций должно быть больше нуля. Минимальное рекомендуемое число итераций — 1000.
RFC 2898 включает методы создания ключа и вектора инициализации (IV) из пароля и соли. Для получения ключей с помощью псевдослучайной функции, позволяющей создавать ключи практически неограниченной длины, можно использовать PBKDF2— функцию на основе пароля. Класс Rfc2898DeriveBytes можно использовать для создания производного ключа из базового ключа и других параметров. В функции формирования ключа на основе пароля базовый ключ является паролем, а другие параметры — значение соли и число итераций.
Никогда не жестко запрограммируйте пароль в исходном коде. Жестко заданные пароли можно извлечь из сборки с помощью Ildasm.exe (дизассемблировщик IL), с помощью шестнадцатеричного редактора или просто открыв сборку в текстовом редакторе, например Notepad.exe.
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Implements password-based key derivation functionality, PBKDF2, by using a pseudo-random number generator based on HMACSHA1.
Constructors
Initializes a new instance of the Rfc2898DeriveBytes class using a password, a salt, and number of iterations to derive the key.
Initializes a new instance of the Rfc2898DeriveBytes class using the specified password, salt, number of iterations and the hash algorithm name to derive the key.
Initializes a new instance of the Rfc2898DeriveBytes class using a password and salt to derive the key.
Initializes a new instance of the Rfc2898DeriveBytes class using a password, a salt, and number of iterations to derive the key.
Initializes a new instance of the Rfc2898DeriveBytes class using the specified password, salt, number of iterations and the hash algorithm name to derive the key.
Initializes a new instance of the Rfc2898DeriveBytes class using the password and salt size to derive the key.
Initializes a new instance of the Rfc2898DeriveBytes class using a password, a salt size, and number of iterations to derive the key.
Initializes a new instance of the Rfc2898DeriveBytes class using the specified password, salt size, number of iterations and the hash algorithm name to derive the key.
Rfc2898DeriveBytes(String, Byte[], Int32)
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль, расширяющее значение и число итераций для формирования ключа.
Параметры
Пароль, используемый для формирования ключа.
Соль, используемая для формирования ключа.
Число итераций для данной операции.
Исключения
Размер указанного расширяющего значения менее 8 байт, а число итераций менее 1.
Пароль или расширяющее значение равны null .
Применяется к
Properties
Gets the hash algorithm used for byte derivation.
Gets or sets the number of iterations for the operation.
Gets or sets the key salt value for the operation.
Rfc2898DeriveBytes(String, Int32)
Инициализирует новый экземпляр класса Rfc2898DeriveBytes, используя пароль и соль для формирования ключа.
Параметры
Пароль, используемый для формирования ключа.
Размер произвольной соли, которую должен создать класс.
Исключения
Указанный размер расширяющего значения менее 8 байт.
Пароль или расширяющее значение равны null .
Методы
Возвращает криптографический ключ из объекта Rfc2898DeriveBytes.
При переопределении в производном классе освобождает все ресурсы, используемые текущим объектом DeriveBytes.
Освобождает неуправляемые ресурсы, используемые классом Rfc2898DeriveBytes (при необходимости освобождает и управляемые ресурсы).
Если переопределено в производном классе, освобождает неуправляемые ресурсы, используемые классом DeriveBytes, и опционально освобождает управляемые ресурсы.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Инициализирует новый экземпляр класса Rfc2898DeriveBytes.
Примеры
В следующем примере кода класс используется Rfc2898DeriveBytes для создания двух идентичных ключей Aes для класса. Затем он шифрует и расшифровывает некоторые данные с помощью ключей.
Methods
Derives a cryptographic key from the Rfc2898DeriveBytes object.
When overridden in a derived class, releases all resources used by the current instance of the DeriveBytes class.
Releases the unmanaged resources used by the Rfc2898DeriveBytes class and optionally releases the managed resources.
When overridden in a derived class, releases the unmanaged resources used by the DeriveBytes class and optionally releases the managed resources.
в чем разница между использованием Rfc2898DeriveBytes и просто используя Encoding.ASCII.GetBytes(string object); ?
у меня был относительный успех с любым подходом, первый-более длинный подход, где последний прост и по существу. Оба, кажется, позволяют вам делать то же самое в конечном итоге, но я изо всех сил пытаюсь понять смысл использования первого над последним.
основная концепция, которую я смог понять, заключается в том, что вы можете конвертировать строковые пароли в байт массивы, используемые, например, для симметричного класса шифрования, AesManaged . Через класс RFC, но вы можете использовать значения соли и пароль при создании объекта rfc. Я предполагаю, что это более безопасно, но все же это необразованная догадка в лучшем случае! Кроме того, что он позволяет возвращать байтовые массивы определенного размера, ну что-то вроде этого.
вот несколько примеров, чтобы показать вам, откуда я иду:
объект 'rfcKey' теперь можно использовать в направлении настройка интернет .Ключ или. IV свойства о классе симметричного алгоритма шифрования.
' rj ' должен быть готов к работе !
запутанная часть . поэтому вместо использования объекта "rfcKey" я могу не просто использовать мой массив' myPassInBytes 'поможет настроить мой объект 'rj'?
Я попытался сделать это в VS2008, и немедленный ответ-нет. Но у вас, ребята, есть более образованный ответ о том, почему класс RFC используется над другим альтернатива, о которой я упоминал выше?
Читайте также: