Я созерцая на лучший подход для brainwallets, чем просто "Секретный ключ = SHA256 (ключевая фраза)",
Сейчас я намерен использовать что-то вроде этого:
Секретный ключ = sHA256100(Р) XOR SHA-3100(п)
где HashN(Р) = Хеш (Hash (... п раз ... (Хэш (Хэш (р) + р) ... + р) + р)
Мы имеем дело с 256-битными ключами здесь, так что, я имею в виду SHA-3 Keccak-256.
Мои рассуждения опережать этот подход:
1. Я знаю PBKDF2, Bcrypt и Scrypt сильнее с точки зрения грубой силы сопротивления (в зависимости от коэффициента работы + Scrypt также памяти тяжелые). Проблема: Я хочу что-то, что также позволяет людям создавать brainwallets на стороне клиента с смартфонами. Ожидание несколько секунд приемлемо, 30 сек нет. Выделенный хакер обычно будет иметь тысячи, или, вернее, миллионы раз больше энергии, чем хэширования мобильного устройства Среднее Джо. Поэтому я не могу применять слишком много требований к производительности. Мой подход должен быть разумным компромиссом. Кстати, мой метод очень PBKDF2-так (с фиксированным счетчиком цикла 100).
2. Я знаю, что это, как правило, лучше использовать подход HMAC вместо регулярного хэширования, или что-то другое, что принимает не только ключевую фразу, но и какой-то соли или ключа. Проблема: люди должны помнить не только ключевую фразу, но и ключ, который, вероятно, чрезмерно усложняет вещи. Выведение соли или ключа из ключевой фразы, кажется, разумный компромисс, который также является более или менее то, что я делаю в моем подходе. Тем не менее, для людей, которые могут управлять вспоминать как ключевую фразу и ключ (или вспомнить ключевую фразу и хранение ключа peusdorandom в KeePass или любой другой), я думаю HashN(К, р) = Hash (к + Hash (к + ... Hash (к + Hash (к + р) + р) ... + р) + р) была бы жизнеспособной альтернативой.
3. Способ Я укладки или вложенности функции хеширования, что H (H (Н (р) + р) + р) вместо H (H (Н (р))), является обеспечение максимальной энтропии обслуживания. Насколько я знаю, нет никаких известных доказательств того, что уменьшение вклада в 256-битовых значения, не значительно уменьшить выходную энтропию, или что этот эффект может даже складывает в нескольких этапах хэширования. Повторно включая входной р на каждый шаг позволяет избежать этого.
4. Xorring на SHA256 и SHA-3 выводит эффективно дает мне Больше чем самое лучшее из обоих миров. Если один из этих алгоритмов хеширования когда-либо становится ослабленными (т.е. становится уязвимой к лучшей, чем грубая силе colission атака), такая уязвимость не может быть злоупотреблений в моем подходе, как результат все еще омлета с другим алгоритмом. И даже если и то и другое Algos компрометация, это, вероятно, до сих пор не может злоупотреблять, поскольку эти атаки также требуют другого входа, так что атаки, как правило, являются взаимоисключающими.
5. Очевидно, что это плохая идея (менее безопасно и просто глупо) придумывать свои собственные решения криптографических вместо того, чтобы использовать существующие, проверенные, хорошо известные алгоритмы. Поэтому я, опираясь на проверенные принципы в максимально возможной степени.
Есть предположения?