Подходящий метод в python до га sh некоторых данных в практически защищенном от коллизий ключе - PullRequest
0 голосов
/ 28 марта 2020

Что является подходящим методом в python для получения sh некоторых данных в практически защищенном от коллизий ключе (так, вероятно, 128 битах или около того)? Система по-прежнему использует Python 2.7.

. Я изучал хэш-хаб Sha1 и MD5, но трудно найти информацию об этих хешах, которые не относятся к безопасности.

Мне просто нужно что-то, что:

  • будет выдавать тот же ключ для тех же данных
  • Маловероятно, что возникнут конфликты ключей (так, вероятно, около 128 бит или около того)
  • Не медленный (хеши, предназначенные для безопасности, как правило, намеренно медленные)

1 Ответ

0 голосов
/ 29 марта 2020

Это то, что я в итоге сделал.

Мне нравится кодировать в base64 подобные вещи, потому что это позволяет избежать проблем, уменьшая набор символов до того, который принят / совместим в большинстве мест, не уменьшая размер ключ слишком похож на шестнадцатеричное кодирование. Вы никогда не знаете, куда вы захотите прикрепить этот ID / ключ в будущем.

Я убрал знак '=' в конце, потому что иногда это вызывает проблемы с URL-адресами. Математически это повышает вероятность столкновения идентификатора, потому что '=' указывает информацию. Но я думаю, что оставшихся данных более чем достаточно для предотвращения коллизий, особенно потому, что sha1 составляет 160 бит вместо 128. UUIDs составляют 128 байтов, потому что, хотя технически возможно иметь коллизию UUID, шансы на то, что это действительно происходит, так бесконечно малы что коллизия практически невозможна (предполагается, что вы используете хороший алгоритм хеширования с хорошим случайным распределением).

import hashlib
import base64 

def get_key(raw_text):

    m = hashlib.sha1()
    m.update(raw_text)
    raw_bytes_key = m.digest()
    key           = base64.urlsafe_b64encode(raw_bytes_key).replace('=', '')

    return key
...