Как в XQuery запутать текстовую строку и сохранить ее длину символов при выводе?

Мне нужно запутать текстовое содержимое элемента. Скажем, например, идентификатор плана. Идентификатор плана может появляться несколько раз в одном документе или в разных документах. Мне нужно, чтобы запутанный идентификатор плана был уникальным и последовательным (всегда сопоставлял 12345 с abc72) и ограничивался только 5 символами. Я бы предпочел не иметь отдельного существующего документа, который использовался бы в качестве файла сопоставления или содержал бы ключи.

Простая хеш-функция не будет работать из-за ограничения длины символа. Любые другие идеи? Я хотел бы продолжать делать это в чистом XQuery.


person Eric Bloch    schedule 20.01.2014    source источник
comment
Насколько важна безопасность? Я спрашиваю, потому что что-то вроде fn:translate не будет иметь большой безопасности. Если кто-то знает, что идентификатор источника состоит из пяти цифр, сопоставление становится намного проще угадать.   -  person mblakele    schedule 21.01.2014
comment
это не безопасность по неясности - просто общее запутывание.   -  person Eric Bloch    schedule 21.01.2014


Ответы (2)


Вы можете использовать fn:translate (похоже на команду unix tr), чтобы надежно преобразовать один символ в другой. Это похоже на старый добрый rot13, но более гибкий и мощный.

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

person Eric Bloch    schedule 20.01.2014

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

substring(
  xdmp:integer-to-hex(xdmp:hash64($input)),
  1, string-length($input))

Пока функция хеширования хороша, это должно работать нормально. Если вам нужно обрабатывать длинные строки, дополните хеш несколько раз, а затем усеките. Если вам нужна какая-либо безопасность, вы должны добавить закрытый ключ и заменить xdmp:hash64 на xdmp:hmac-sha512. В любом случае это может быть хорошей идеей, поскольку SHA-2 512 имеет хорошо известные характеристики.

substring(
  xdmp:hmac-sha512($key, $input, 'base64'),
  1, string-length($input))

Коллизии хешей возможны, но маловероятны.

person mblakele    schedule 21.01.2014