как я могу уникально хешировать / запутывать 9-11 символов - PullRequest
2 голосов
/ 29 сентября 2010

У меня есть серия кодов в формате:

AA12345A1

т.е.: [a-z]{2}[0-9]{5}[a-z][0-9]

и

AA12345A123

т.е.: [a-z]{2}[0-9]{5}[a-z][0-9]{3}

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

Ограничения для нового формата кода:

  • они должны быть удобны для использования человеком (поэтому использование заглавных и строчных букв является плохой идеей для удобства использования, они также должны быть максимально короткими)
  • они всегда должны быть уникальными (ни один код из 9 или 11 не должен выдавать один и тот же вывод)
  • это должен быть только односторонний хеш, мне никогда не нужно возвращать исходный код
  • длина исходного кода (9 или 11 символов) не должна быть очевидной - она ​​не должна быть криптографической, просто непрозрачной для непрофессионала.

Существуют ли подходящие алгоритмы хеширования (или иные) для этого, или у кого-нибудь есть какие-либо предложения для нестандартного способа сделать это?

Спасибо

Ответы [ 3 ]

3 голосов
/ 29 сентября 2010

Вот одна возможность.

Для кодов из девяти символов вставьте случайную четную букву (B, D, F, ...) после первой цифры и две случайные цифры в конце.

Для кодов из одиннадцати символов вставьте случайную нечетную букву (A, C, E, ...) после первой цифры и оставьте все остальное как есть.

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

Таким образом, вы получите двенадцатизначный код для обоих случаев, который вы можете изменить в случае необходимости.Это читабельно и уникально.Это не, как вы говорите, криптография уровня АНБ, но она должна сдерживать случайного наблюдателя.


Если вам нужен хеш, который генерирует более детерминированный результат (то есть, нет случайных чисел), вы можетесделать добавленный материал зависимым от входных данных.Вот один из способов, возможно, есть еще сотни.Рассмотрим два типа ввода:

AB12345C6
AB12345C678

В обоих случаях вставьте символ после 1, но сделайте его зависимым от ввода.Сложите цифры в позициях 1, 3 и 6 и возьмите их по модулю-10, чтобы получить от 0 до 9.

Используйте это как поиск в строке "ABXVRWECPU" длядевятизначный код или «OIYJTQLSDK» для одиннадцатизначного кода для получения символа.Затем вы можете использовать этот символ в результирующем коде, чтобы решить, был ли он изначально кодом из девяти или одиннадцати символов (настоящий параноик будет гарантировать, что эти строки не сохраняются в текстовом виде в коде).

Для двухцифры, добавляемые к первому случаю, сложите коды ASCII для A, C и функцию B (например, xor 'B' с 147), затем добавьте это к числам, образованным из 64, 51 и 23.

Возьмите модуль 87 из этого, затем добавьте 7, чтобы получить значение от 7 до 93.

2 голосов
/ 29 сентября 2010

Очень простой способ запутать это:

  • Тайно и случайным образом выбрать половину алфавита для обозначения 9 символов, а другую половину для обозначения 11 символов.
  • Prependодна случайная буква из правильной половины в строку (т. е. если это строка из 9 символов, предшествующая букве из половины из 9 символов)
  • Если строка состоит из 9 символов, добавьте 2 случайные цифры

Затем, при использовании, вы знаете, что если первый символ от половины, означающей 9 символов, вы можете отбросить две последние цифры.

В итоге вы получите 12 символов для каждой строки, хотя.

0 голосов
/ 29 сентября 2010

У вас есть две задачи:

  • Создать хеш
  • Представлять в удобной для человека форме

Так что используйте, например, SHA1 с исходной строкой в ​​качестве входных данных и получить двоичный результат. => Хеширование. Из двоичного хеша получаем 9 (или 11) * 5 бит и используем следующую таблицу:

00000 -> "0"
00001 -> «1»
...
01001 -> "9"
01010 -> «А»
...
11111 -> "Z"

В таблице не используются некоторые буквы, которые могут меня перепутать (например, «L» == «l» может быть случайно прочитано как «1»; пропустите буквы «Q» и «O», потому что вы используете цифру «0»). «). Вам нужно 10 цифр плюс 22 символа.

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

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