Obfuscator
Русский
Ruby-гем для обфускации данных с сохранением их структуры и формата. Поддерживает:
- Текст на русском и английском языках
- Числа (включая IP-адреса и смешанный контент)
- Даты в различных форматах
- Воспроизводимые результаты через seed
Установка
Добавьте эту строку в Gemfile вашего приложения:
gem 'obfuscator-rb'
И выполните:
$ bundle install
Или установите самостоятельно:
$ gem install obfuscator-rb
Установка из репозитория hub.mos.ru:
$ gem install obfuscator-rb --source https://hub.mos.ru/ad/obfuscator.git
Код также доступен на GitHub и Gitverse.
Возможности
Обфускация чисел
- Сохраняет формат и структуру чисел (десятичные, тысячные разделители)
- Обрабатывает IP-подобные последовательности (например, "21.11.234.23")
- Поддерживает сохранение ведущих нулей (настраиваемо)
- Предоставляет режим для работы только с положительными числами
- Сохраняет точность десятичных дробей
- Обрабатывает смешанный контент с числами и текстом
- Поддерживает латинский и кириллический алфавиты
Обфускация дат
- Поддерживает множество форматов дат через пресеты (ISO, EU, US, русский)
- Сохраняет структуру и валидность формата
- Настраиваемые ограничения:
- Диапазон допустимых лет
- Сохранение месяца
- Сохранение дня недели
- Обрабатывает полный формат ISO с временной зоной
Общие возможности
- Детерминированный вывод с опциональным сидом
- Обфускация с сохранением формата
- Поддержка кодировки UTF-8
- Комплексная обработка ошибок
- Эффективное использование памяти
Многопоточность
Отдельные экземпляры обфускаторов не являются потокобезопасными. Для многопоточных операций:
- Создавайте отдельный экземпляр для каждого потока
- Не используйте один экземпляр в разных потоках
- Каждый экземпляр поддерживает свое собственное состояние RNG
Использование
require 'obfuscator-rb'
# Обфускация текста (режим :direct по умолчанию)
obfuscator = Obfuscator::Multilang.new
text = "Hello, Привет! This is a TEST текст."
result = obfuscator.obfuscate(text)
# => Каждое слово обфусцируется с использованием исходного алфавита
# => "Idise, Кющэшэ! Izib oq g MUGU дипяд."
# Смешанный режим с обоими алфавитами
obfuscator = Obfuscator::Multilang.new(mode: :mixed)
result = obfuscator.obfuscate(text)
# => Слова могут содержать и латинские, и кириллические символы
# => "Fаyef, Фeфeгю! Muci лi r HЫЛO ицижё."
# С натурализацией по простым правилам для более естественного вывода
obfuscator = Obfuscator::Multilang.new(mode: :mixed, naturalize: true)
result = obfuscator.obfuscate(text)
# => Вывод обрабатывается для более естественного вида
# => "Ohеsion, Wорыой! Наvы мe л ЛУНI yeзing."
# С сидом для воспроизводимых результатов
obfuscator = Obfuscator::Multilang.new(seed: 12345)
result = obfuscator.obfuscate(text)
# => Одинаковый ввод + одинаковый сид = одинаковый вывод
# => "Cumic, Фяцёне! Okac ub h POWO щюзёс."
# Обфускация чисел
obfuscator = Obfuscator::NumberObfuscator.new
obfuscator.obfuscate(123.45) # => 567.89
obfuscator.obfuscate("1 234,56") # => "5 678,91"
obfuscator.obfuscate("192.168.1.1") # => "234.567.8.9"
# С настройками
obfuscator = Obfuscator::NumberObfuscator.new(
preserve_leading_zeros: false, # Не сохранять ведущие нули
unsigned: true, # Убрать знаки минус
seed: 12345 # Для воспроизводимых результатов
)
obfuscator.obfuscate("0042") # => "7391"
obfuscator.obfuscate("-123") # => "456"
# Обфускация даты
obfuscator = Obfuscator::DateObfuscator.new
obfuscator.obfuscate('2024-03-15') # => "2025-08-23"
# Разные форматы дат
eu = Obfuscator::DateObfuscator.new(format: :eu) # Европейский формат
eu.obfuscate('15.03.2024') # => "23.08.2025"
us = Obfuscator::DateObfuscator.new(format: :us) # Американский формат
us.obfuscate('03/15/2024') # => "08/23/2025"
rus_short = Obfuscator::DateObfuscator.new(format: :rus_short) # Короткий формат
rus_short.obfuscate('15.03.24') # => "23.08.25"
# С ограничениями
constrained = Obfuscator::DateObfuscator.new(
format: :rus,
constraints: {
min_year: 2020, # Не генерировать даты раньше 2020
max_year: 2025, # Не генерировать даты позже 2025
preserve_month: true, # Сохранять месяц
preserve_weekday: true # Сохранять день недели
}
)
constrained.obfuscate('15.03.2024') # => "14.03.2025" (тот же месяц, тот же день недели)
# С сидом для воспроизводимых результатов
seeded = Obfuscator::DateObfuscator.new(format: :rus, seed: 12345)
seeded.obfuscate('15.03.2024') # => "21.07.2025" (постоянный результат)
Доступные режимы
-
:direct
(по умолчанию) - сохраняет исходный язык для каждого слова -
:eng_to_eng
- только английский в английский -
:rus_to_rus
- только русский в русский -
:swapped
- английский в русский и наоборот -
:mixed
- использует оба алфавита
Доступные пресеты для даты
-
:eu
=>'%d.%m.%Y'
- европейский формат (31.12.2023) -
:eu_short
=>'%d.%m.%y'
- короткий европейский формат (31.12.23) -
:rus
=>'%d.%m.%Y'
- русский формат (31.12.2023) -
:rus_short
=>'%d.%m.%y'
- короткий русский формат (31.12.23) -
:iso
=>'%Y-%m-%d'
- формат ISO (2023-12-31) -
:us
=>'%m/%d/%Y'
- американский формат (12/31/2023) -
:us_short
=>'%m/%d/%y'
- короткий американский формат (12/31/23) -
:iso_full
=>'%Y-%m-%dT%H:%M:%S%z'
- полный формат ISO (2023-12-31T00:00:00+00:00)
Обработка ошибок
begin
obfuscator.obfuscate(text)
rescue Obfuscator::InputError => e
# Обработка неверного типа входных данных
puts "Неверный тип данных: #{e.message}"
rescue Obfuscator::EncodingError => e
# Обработка проблем с кодировкой
puts "Ошибка кодировки: #{e.message}"
rescue Obfuscator::Error => e
# Обработка прочих ошибок обфускации
puts "Ошибка обфускации: #{e.message}"
end
English
A Ruby gem for data obfuscation that preserves structure and format. Supports:
- Text in both English and Russian
- Numbers (including IP addresses and mixed content)
- Dates in various formats
- Reproducible results via seeding
Installation
Add this line to your application's Gemfile:
gem 'obfuscator-rb'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install obfuscator-rb
Install from hub.mos.ru:
$ gem install obfuscator-rb --source https://hub.mos.ru/ad/obfuscator.git
The code is also available on GitHub and Gitverse.
Features
Number Obfuscation
- Preserves number format and structure (decimals, thousand separators)
- Handles IP-like sequences (e.g., "21.11.234.23")
- Supports leading zeros preservation (configurable)
- Provides unsigned mode for positive-only output
- Maintains consistent decimal precision
- Processes mixed content with numbers and text
- Supports both Latin and Cyrillic alphabets
Date Obfuscation
- Supports multiple date formats through presets (ISO, EU, US, Russian)
- Preserves format structure and validity
- Configurable constraints:
- Year range limits
- Month preservation
- Weekday preservation
- Handles full ISO datetime format with timezone
General Features
- Deterministic output with optional seeding
- Format-preserving obfuscation
- UTF-8 encoding support
- Comprehensive error handling
- Memory-efficient processing
Thread Safety
Individual obfuscator instances are NOT thread-safe. For concurrent operations:
- Create separate instances per thread
- Do not share instances across threads
- Each instance maintains its own RNG state
Usage
require 'obfuscator-rb'
# Text obfuscation (default :direct mode)
obfuscator = Obfuscator::Multilang.new
text = "Hello, Привет! This is a TEST текст."
result = obfuscator.obfuscate(text)
# => Each word is obfuscated using its source alphabet
# => "Idise, Кющэшэ! Izib oq g MUGU дипяд."
# Mixed mode with both alphabets
obfuscator = Obfuscator::Multilang.new(mode: :mixed)
result = obfuscator.obfuscate(text)
# => Words may contain both Latin and Cyrillic characters
# => "Fаyef, Фeфeгю! Muci лi r HЫЛO ицижё."
# With basic naturalization for more natural-looking output
obfuscator = Obfuscator::Multilang.new(mode: :mixed, naturalize: true)
result = obfuscator.obfuscate(text)
# => Output is processed to look more natural
# => "Ohеsion, Wорыой! Наvы мe л ЛУНI yeзing."
# With seed for reproducible results
obfuscator = Obfuscator::Multilang.new(seed: 12345)
result = obfuscator.obfuscate(text)
# => Same input + same seed = same output
# => "Cumic, Фяцёне! Okac ub h POWO щюзёс."
# Number obfuscation
obfuscator = Obfuscator::NumberObfuscator.new
obfuscator.obfuscate(123.45) # => 567.89
obfuscator.obfuscate("1,234.56") # => "5,678.91"
obfuscator.obfuscate("192.168.1.1") # => "234.567.8.9"
# With configuration
obfuscator = Obfuscator::NumberObfuscator.new(
preserve_leading_zeros: false, # Don't keep leading zeros
unsigned: true, # Remove minus signs
seed: 12345 # For reproducible results
)
obfuscator.obfuscate("0042") # => "7391"
obfuscator.obfuscate("-123") # => "456"
# Date obfuscation
obfuscator = Obfuscator::DateObfuscator.new
obfuscator.obfuscate('2024-03-15') # => "2025-08-23"
# Different date formats
eu = Obfuscator::DateObfuscator.new(format: :eu) # European format
eu.obfuscate('15.03.2024') # => "23.08.2025"
us = Obfuscator::DateObfuscator.new(format: :us) # US format
us.obfuscate('03/15/2024') # => "08/23/2025"
rus_short = Obfuscator::DateObfuscator.new(format: :rus_short) # Short format
rus_short.obfuscate('15.03.24') # => "23.08.25"
# With constraints
constrained = Obfuscator::DateObfuscator.new(
format: :iso,
constraints: {
min_year: 2020, # Don't generate dates before 2020
max_year: 2025, # Don't generate dates after 2025
preserve_month: true, # Keep the same month
preserve_weekday: true # Keep the same day of week
}
)
constrained.obfuscate('2024-03-15') # => "2025-03-14" (same month, same weekday)
# With seed for reproducible results
seeded = Obfuscator::DateObfuscator.new(seed: 12345)
seeded.obfuscate('2024-03-15') # => "2025-07-21" (consistent output)
Available Modes
-
:direct
(default) - preserves source language for each word -
:eng_to_eng
- English to English only -
:rus_to_rus
- Russian to Russian only -
:swapped
- English to Russian and vice versa -
:mixed
- uses both alphabets
Available Date Presets
-
:eu
=>'%d.%m.%Y'
- European format (31.12.2023) -
:eu_short
=>'%d.%m.%y'
- Short European format (31.12.23) -
:rus
=>'%d.%m.%Y'
- Russian format (31.12.2023) -
:rus_short
=>'%d.%m.%y'
- Short Russian format (31.12.23) -
:iso
=>'%Y-%m-%d'
- ISO format (2023-12-31) -
:us
=>'%m/%d/%Y'
- US format (12/31/2023) -
:us_short
=>'%m/%d/%y'
- Short US format (12/31/23) -
:iso_full
=>'%Y-%m-%dT%H:%M:%S%z'
- Full ISO format (2023-12-31T00:00:00+00:00)
Error Handling
begin
obfuscator.obfuscate(text)
rescue Obfuscator::InputError => e
# Handle invalid input types
puts "Invalid input type: #{e.message}"
rescue Obfuscator::EncodingError => e
# Handle encoding issues
puts "Encoding error: #{e.message}"
rescue Obfuscator::Error => e
# Handle other obfuscation errors
puts "Obfuscation error: #{e.message}"
end
License
The gem is available as open source under the terms of the MIT License.