Простая (для кодирования) безопасная хеш-функция - PullRequest
7 голосов
/ 03 августа 2009

Мне нужна безопасная (криптографическая) хеш-функция со следующими свойствами:

  1. Может быть закодировано как можно меньшим количеством строк (в схеме R5RS). Надеюсь, до 50 лет.
  2. Производительность памяти и процессора в пределах разумного для данных длины пароля. (например, он не должен быть суперэффективным или создавать хэши для миллионов байтов данных)

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

Текущий кандидат - Mash-1 (или Mash-2): Справочник по прикладной криптографии. Google Книги

Спасибо.

Edit: Спасибо всем за ваши ответы до сих пор. Пожалуйста, прости меня, если следующее кажется грубым, я просто хочу прояснить ситуацию. Пожалуйста, поверьте мне, что я сделал свою домашнюю работу и рассмотрел «стандартные» варианты. Я знаю, что проще всего использовать один из них, но это не то, что я ищу.

Единственный вопрос, на который я пытаюсь ответить: Какой криптографически безопасный алгоритм хеширования может быть реализован в наименьшем количестве «читаемого» кода?

Я уже разместил лучшего кандидата, которого смог найти. Любые предложения о чем-то более простом или комментарии о Mash-1/2 были бы наиболее полезными.

Ответы [ 5 ]

4 голосов
/ 03 августа 2009

Если вы хотите использовать безопасную хеш-функцию для реальной защиты чего-либо (скажем, как часть алгоритма шифрования), вам лучше всего использовать библиотеку SHA-512 (или, возможно, RIPEMD-160 или несколько другие).

Если вы хотите использовать его для хеширования паролей, я бы сказал, что хэш-функция, такая как MASH, будет соответствовать требованиям устойчивости к грубой силе (при использовании с солью) и радужным таблицам. Я бы по-прежнему не использовал его, если бы у меня не было строгих требований, запрещающих или не позволяющих мне использовать библиотечную реализацию - но, похоже, у вас могут быть именно такие.

Если вы хотите что-то менее безопасное, скажем, для проверки целостности файла, подойдет почти все, если вы явно не обеспокоены злонамеренными пользователями, создающими конфликты. В этом случае, в зависимости от ценности того, что вы защищаете, я бы варьировался от чего-то простого, например, MASH, до чего-то более стойкого, например, SHA-512 или RIPEMD-320.

2 голосов
/ 11 августа 2009

Если вы предпочитаете простоту и педагогическую ценность, а не эффективность, то в качестве опции можно использовать хеш-функцию VSH . Он имеет веские аргументы в пользу того, что VSH является хеш-функцией, устойчивой к столкновениям, хотя в этой функции отсутствуют некоторые другие свойства (например, псевдослучайность), которые есть у других хеш-функций.

2 голосов
/ 04 августа 2009

Согласно разделу 18.12 «Прикладной криптографии» Брюса Шнайера: «Можно использовать алгоритм шифрования с открытым ключом в режиме цепочки блоков в качестве односторонней хэш-функции».

RSA (с удалением закрытого ключа) приведен в качестве примера. Безопасность так же сильна, как RSA.

Шаг шифрования RSA довольно прост в реализации. Особенно в языке, который имеет произвольные размеры целых чисел.

2 предостережения: 1. гораздо медленнее, чем большинство (все) другие безопасные хеш-функции. Что хорошо для меня. 2. Если вы жестко закодировали свои открытые ключи в коде, мир должен был бы поверить в то, что вы отбросили данные своего личного ключа. Или создайте свои собственные открытые закрытые ключи.

Я отправлю код, как только у меня будет рабочий пример.

РЕДАКТИРОВАТЬ: Вот оно. 30 строк. Просто. Secure. РЕДАКТИРОВАТЬ 2: То, что я фактически включил, является вариантом, и может не работать. Смотрите комментарии под этим постом и следите за обновлениями.

; compute a^d mod n
(define powmod
  (lambda (a d n)
    (cond 
      ((= 0 d) 1)
      ((= 1 d) (modulo a n))
      ((= 0 (modulo d 2)) (modulo (expt (powmod a (/ d 2) n) 2) n))
      (else
        (modulo (* (powmod a 1 n) (powmod a (- d 1) n)) n)))))

(define foldr
  (lambda (func end lst)
    (if (null? lst)
      end
      (func (car lst) (foldr func end (cdr lst))))))

; something to turn a string into a number
(define any-string->number
  (lambda (s)
    (foldr
      (lambda (a b) (+ a (* 256 b)))
      0
      (map char->integer (string->list s)))))

; some big primes
(define p 325981479175658910158495167696993467513669112200235950741366213684181287869366665231)
(define q 930416184994449450269535709442344346507738432154879695027334802205487824589832585453)

; hash turns a string into a number
; see discrete logarithms. the inverse of this is *hard* to compute
; http://en.wikipedia.org/wiki/Discrete_logarithm
(define hash
  (lambda (s)
    (powmod (any-string->number s) p q)))
2 голосов
/ 03 августа 2009

Для ваших требований я бы ознакомился с финалистами SHA-3 .

Если у вас реализован примитив AES для шифрования, вы можете использовать его, чтобы реализовать несколько функций относительно просто.

В противном случае, я думаю, я бы пошел с Cubehash Даниэля Бернштейна. У этого, кажется, есть часть той "простой элегантности", которую вы искали.

1 голос
/ 03 августа 2009

Проверьте источник TrueCrypt . Они реализуют несколько сильных хеш-функций. Просто стандартное предупреждение, неразумно изменять существующую реализацию или еще хуже, использовать свою собственную Это почти наверняка привнесет слабость. Я понимаю, что вы делаете это не здесь, а просто отказ от ответственности. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...