Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Eric BlochОтветов: 2

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

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

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

marklogicxquery

Ответы

Ответ 1 · рейтинг 2 · Eric Bloch

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

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

Ответ 2 · рейтинг 1 · mblakele

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

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))

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы