Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как вычислить хэш строки  [new]
Jumbo.love
Member

Откуда: Санкт-Петербург
Сообщений: 35
Мне нужно для задачи со строками уметь считать хэш для строк хотя бы длины 100 символов. Нашёл как это делать (http://e-maxx.ru/algo/string_hashes), но в delphi даже при подсчёте степеней P возникает переполнение на степени 12. Как можно выгодно в delphi посчитать хэш строки или хотя как сделать, что бы число обрезалось и не было ошибки с переполнением?
25 апр 11, 00:13    [10560628]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43840

Jumbo.love
Как можно выгодно в delphi посчитать хэш строки

В Indy дофига классов для вычисления хэшей, включая CRC32 и SHA1.

Posted via ActualForum NNTP Server 1.4

25 апр 11, 00:24    [10560641]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1286
В Indy10 искать TIdHashMessageDigest5
25 апр 11, 13:11    [10562406]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 27476
Jumbo.love
Мне нужно для задачи со строками уметь считать хэш для строк хотя бы длины 100 символов. Нашёл как это делать (http://e-maxx.ru/algo/string_hashes), но в delphi даже при подсчёте степеней P возникает переполнение на степени 12. Как можно выгодно в delphi посчитать хэш строки или хотя как сделать, что бы число обрезалось и не было ошибки с переполнением?


из ссылки, в самом начале:

автор
Само значение хэша желательно хранить в самом большом числовом типе - int64, он же long long. Очевидно, что при длине строки порядка 20 символов уже будет происходить переполнение значение. Ключевой момент - что мы не обращаем внимание на эти переполнения, как бы беря хэш по модулю 2^64.


По умолчанию (если не ошибаюсь) при умножении целых чисел, нет owerflow checking , т.е. не должно возникать ошибки переполнения (хотя переполнение возникает, естественно).
Во всяком случае, можно посмотреть хелп по опции Overflow checking - {$Q+} or {$Q-}
25 апр 11, 15:17    [10563290]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Jumbo.love
Member

Откуда: Санкт-Петербург
Сообщений: 35
S.G.,

при попытке присвоить переменной значение не из диапазона прога сразу вылетает.
25 апр 11, 15:56    [10563568]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 27476
Jumbo.love
S.G.,

при попытке присвоить переменной значение не из диапазона прога сразу вылетает.
Да.
Но никто не предлагает присваивать не из диапазона.
25 апр 11, 18:00    [10564298]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Jumbo.love
Member

Откуда: Санкт-Петербург
Сообщений: 35
S.G.,

так в том и вопрос: в процессе вычисления степеней P в цикле 31 (например) возводится в степень как exp (ln(31)*i) и на i=12 вылетает и надо проследить, чтобы число обрезалось
25 апр 11, 18:45    [10564482]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Нелояльный
Member

Откуда:
Сообщений: 245
А где там вычисление степеней через логарифмы и экспоненты? Каждый раз происходит умножение целочисленного значения на 31, например. Результат в этом случае обрезается каждый раз безо всяких ошибок.
25 апр 11, 19:58    [10564660]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Jumbo.love
Member

Откуда: Санкт-Петербург
Сообщений: 35
Нелояльный,

можно и так, сейчас попробую
25 апр 11, 20:07    [10564687]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Jumbo.love
Member

Откуда: Санкт-Петербург
Сообщений: 35
Вот блин, получилось, правда он округляет почему-то до отрицательных, но ладно
25 апр 11, 20:15    [10564713]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
Подскажите, а длина MD5 всегда одинакова?
Нужно хранить пароль в зашифрованном виде в базе.
Поэтому нужно знать, какую длину поля указывать при создании поля.
Допустим, хватит ли VARCHAR(32)?

Я правильно понимаю, что хеш пароля в MD5 Можно будет вводить в любых национальных символах, если учесть, что база и приложение юникодные?
14 ноя 17, 12:46    [20952264]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28390

хеш всегда имеет фиксированную длину.
для MD5 это 128 бит (16 байт).
можешь хранить так же как GUID, в зависимости от используемой СУБД.
если нет специального типа, можешь хранить как два int64.
а можешь как CHAR(16) CHARACTER SET OCTETS

Posted via ActualForum NNTP Server 1.5

14 ноя 17, 12:59    [20952307]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
Мимопроходящий
можешь хранить как два int64.

я думал, что хеш MD5 - это строка.
14 ноя 17, 13:24    [20952420]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
TIdHashMessageDigest5.HashStringAsHex возвращает строку
14 ноя 17, 13:25    [20952424]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28390

14.11.2017 13:24, X11 пишет:
> я думал, что хеш MD5 - это строка.

ты плохо думал.
подумай ещё.

Posted via ActualForum NNTP Server 1.5

14 ноя 17, 13:28    [20952438]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
Почитал, что MD5 лучше не использовать из-за коллизий.
У InDy ещё есть TIdHashMessageDigest, TIdHashMessageDigest2 и TIdHashMessageDigest4.
Какой правильней использовать?
14 ноя 17, 13:54    [20952587]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
Нашёл TIdHashSHA1
14 ноя 17, 14:02    [20952617]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
Мимопроходящий
ты плохо думал.
подумай ещё.


это байты?
14 ноя 17, 14:03    [20952621]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28390

14.11.2017 14:02, X11 пишет:
> Нашёл TIdHashSHA1

они примерно одинаково "дуростойкие".
разница несущественна.
кроме того SHA1 чуть медленнее.

зы: для "тихушного" заполучения пароля обычно используют "социоинженерные" методы.
для брутфорса нужны уж очень специфические условия, не согласующиеся с "тихушностью".

ззы: не парься, бери любой. уровень паранойи лечится глотком алкоголя.

Posted via ActualForum NNTP Server 1.5

14 ноя 17, 14:12    [20952670]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
SHA1 as Hex можно хранить как строку в базе "6FB476DE07C18C29D7FC9D6DEB1F25B0D91E0504".
14 ноя 17, 14:20    [20952724]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28390

14.11.2017 14:20, X11 пишет:
> SHA1 as Hex можно хранить как строку в базе "6FB476DE07C18C29D7FC9D6DEB1F25B0D91E0504".

любой хэш можно хранить как 16-ричное строковое представление.
точно так же как и GUID, который нихрена не "строковый".

Posted via ActualForum NNTP Server 1.5

14 ноя 17, 14:24    [20952748]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
TIdHashSHA1.HashString возвращает тип System.TArray<System.Byte>

Я не работал с таким типом данных.
Как хранить это в базе, какой тип поля?
Как передать это в базу Firebird 2.5 c использованием FibPlus, например?
пока не догоняю
14 ноя 17, 14:30    [20952789]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2404
X11
Почитал, что MD5 лучше не использовать из-за коллизий.
Коллизии, которые бывают во всех алгоритмах, для сравнения хэшей паролей вообще не важны.
14 ноя 17, 14:32    [20952799]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28390

14.11.2017 14:30, X11 пишет:
> TIdHashSHA1.HashString возвращает тип System.TArray<System.Byte>
>
> Я не работал с таким типом данных.
> Как хранить это в базе, какой тип поля?
> Как передать это в базу Firebird 2.5 c использованием FibPlus, например?
> пока не догоняю

через FIBQuery.
для хранения используй CHAR(20) CHARACTER SET OCTETS.

зы: если это "сложно", используй hex-string и храни как обычную строку.

Posted via ActualForum NNTP Server 1.5

14 ноя 17, 14:36    [20952819]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить хэш строки  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 11347
Мимопроходящий
используй hex-string и храни как обычную строку.


Вот опять пришли к первоначальному вопросу:

X11
Нужно хранить пароль в зашифрованном виде в базе.
Поэтому нужно знать, какую длину поля указывать при создании поля.
Допустим, хватит ли VARCHAR(32)?
14 ноя 17, 14:45    [20952861]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить