Розовый хеш — это как розовый слон, только хеш.

TL;DR

# install
$ pipx install pinkhash

$ echo Hello World! | pink
inject name venue

$ echo Hello World! | pink -l eng1
multivariate antichrist

$ echo Hello World! | pink -l nato
Golf Juliett Mike

$ pink /tmp/*jpg
/tmp/1728229096299.jpg: spot slogan tomato
/tmp/f3e0dff990f6a65cb1da0860d2ee906a.jpg: pretty nuclear park
...

Даже голый эндокринолог лучше ваших хешей!

Допустим, вы вычислили какой-то шех и напечатали, скажем, 8f776debaf8b5031643aa463ba5bf0dc. Казалось бы - ну что тут плохого? Но если подумать - это настолько плохо, что вряд ли что-то может быть хуже этого. Все, что может выдумать мое нездоровое воображение - все лучше, чем это. Злодейская трапеция - лучше чем этот хеш. Голый эндокринолог. Трезвая обезьяна. Недовольный Хирон. И даже (крещусь) многомерный антихрист. Все это лучше, чем этот ваш хеш.

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

Незабываемые розовые хеши

Розовый хеш — это как розовый слон, только хеш
Розовый хеш — это как розовый слон, только хеш

Наш мозг не умеет хорошо запоминать шестнадцатеричные числа, но зато очень хорошо приспособлен к "белым обезьянам" (или, нечто подобное на английском: "розовым слонам"). Как известно, даже если мы изо всех сил будем стараться забыть, не думать о белой обезьяне - мы все равно будем о ней думать! Значит, надо превращать хеши в более мнемоничных белых обезьян и розовых слонов!

Если прямо сейчас вам позвонит Марго Робби, будет умолять о свидании, и вы согласитесь, наутро вы все равно легко сможете вспомнить, какое розовое животное упоминалось в этом посте.

На самом деле, вы уже наверняка встречались с подобным в названиях docker-контейнеров. Если вы не указали имя контейнеру, docker придумает его за вас, и контейнер с ID 2874d14848b7eabbe1772ed4fbfe94adfce5d77633514941ec3a8be451dc62e2 превратится в clever_cannon (Умная пушка!). Вероятность коллизии в этом мнемоническом хеше немного выше, но для целей указания на один из пяти запущенных контейнеров - этого все равно более чем достаточно.

Пакет pinkhash

Pinkhash - небольшой python-пакет для интеграции в ваши программы и утилита командной строки. Ставится простой командой: pipx install pinkhash (ну или pip install pinkhash), а утилиту можно использовать так же, как и md5sum или sha256sum. Примеры - в начале статьи.

Языки

Способ кодирования данный в pinkhash называется языком (не путать с человеческими языками и языками программирования). Сейчас поддерживается несколько языков, но в будущем можно добавить и другие (например, к eng1 было бы неплохо добавить rus1 с согласованием родов, или сделать язык, который выдает только рифмованные слова, для удобства запоминания или словарь по мотивам Гарри Поттера или Звездных войн). Pull-request'ы одобряются и приветствуются.

Общее для всех языков. Входные данные хешируются sha1, из хеша берется только 8 последних байт, они превращаются (little-endian) в число и это число уже передается языку для превращения в слова. Язык просто получает число и выдает список слов. Типичный алгоритм - делим число на размер словаря, и остаток дает первое слово. Повторяем с результатом, пока число не станет нулем.

nato - самый простой язык, основанный на Nato Phonetic Alphabet (он же - алфавит ICAO и др.). 26 слов (Alpha, Bravo, Charlie, ...), каждое соответствует букве. По умолчанию кодирует в 3 слова (можно изменить через -w). Количество комбинаций - 26N , где N - количество слов. Пример: Oscar Victor India.

bip39 - аналогично, но на основе словаря (2048 слов) из стандарта BIP-0039, который используется в bitcoin. (Каждое слово имеет уникальные 4 первых буквы и нет похожих слов) По умолчанию используется словарь английского языка, но есть и все остальные (выбирать через -o it например, даже 2 варианта китайского есть). Соответственно, каждое слово дает 2048 (211) вариантов. 3 слова (по умолчанию) - дает 233 - 8.5 млрд комбинаций. Этот словарь используется по умолчанию. Пример: pitch shop rebuild

rfc1751 - язык на основе словаря из RFC 1751, так же 2048 комбинаций. Короткие слова до 4 букв. Пример: DAD CODE CAR

eng1 - словарь английских существительных (55197) и прилагательных (17873), собран из NLTK/Wordnet. Дает всегда пару прилагательное + существительное, имеет почти миллиард комбинаций. Генерирует порой такие словосочетания, что даже после перевода в Google Translate я не понимаю, что это. Пример: shingly thrinax.

Небольшой дисклеймер: Несмотря на то, что здесь упоминаются четкие стандарты (RFC1751 и BIP-0039), pinkhash не является инструментом для работы с данными по этим стандартам. Он просто заимствует хорошие словари из этих стандартов.

На Python

from pinkhash import PinkHash, PinkHashError
import sys

try:
    pink = PinkHash(language_name="bip39", option="en", nwords=3)
except PinkHashError as e:
    print(e, file=sys.stderr)
    sys.exit(1)

data = sys.stdin.buffer.read()
r = pink.convert(data)
print(r)
 $ echo Hello World! | python example.py 
inject name venue

Хранить пароли в слоне?

А еще, pinkhash можно использовать для создания парольных фраз (Correct Horse Battery Stapple, помним, да?)

echo My password for habr.com | pink -w 5 
insect magnet flower grief rib

InsectMagnetFlowerGriefRib - прекрасный пароль для хабра и уникальный. Берите, кто хочет.

Репозиторий: https://github.com/yaroslaff/pinkhash

Ну и в завершении: Помните голого эндокринолога из начала статьи? А хеш?

Комментарии (7)