Спосіб зберігання текстових даних. Частина 2
Сучасний світ у сфері обслуговування з кожним роком стає все більш цифровим. З часом все більше організацій та підприємств підключають обслуговування онлайн повністю, частково або на вибір. Сьогодні можна проконсультуватися з сімейним лікарем телефоном або відправити йому повідомлення через чат на сайті поліклініки. Рахунки за комунальні послуги оплачуються кредитною карткою на сайтах через спеціальний термінал. Багато інших послуг надаються онлайн, включаючи державні. І чим більше ми інтегруємося в цифровий світ, тим більше шанс зіткнутися з небезпеками цього світу. Йдеться про фактори, через які ви можете позбутися своїх заощаджень. Серед них можуть бути фішингові атаки, дзвінки шахраїв, зараження комп’ютера шкідливим ПО, соціальна інженерія, фейкові новини та інші. І кожен із них може призвести до небажаного доступу третіх осіб до ваших особистих даних, платіжних реквізитів і паролів.
Я завжди цікавився темою безпеки зберігання інформації. Можете називати це параноєю, мені байдуже. Зберігаю всі свої паролі на домашньому комп’ютері у файлі Excel, файл захищений паролем. Копію цього файлу я зберігаю на хмарному сховищі Google Drive, в обліковому записі Google у мене увімкнена двоетапна автентифікація. На мобільному телефоні Samsung у мене встановлений антивірус Eset Internet Security, за допомогою цієї програми я можу задати графічний ключ доступу до певних додатків, один з них — Google Drive. Так, є прогалини в моїй системі зберігання паролів, але всьому є межа.
Одного разу я описував спосіб шифрування текстових даних за допомогою Javascript і алгоритму AES (Advanced Encryption Standard). На мою думку, цей спосіб достатньо ефективний, але деякі складові елементи коду мені не подобаються:
По-перше, це стороння бібліотека, яка є механізмом роботи скрипта. Цю бібліотеку можна завантажити й вставити в один файл із виконавчим скриптом, але це величезний обсяг тексту та виглядає він хрен знати як.
По-друге, цей алгоритм відомий широкому колу людей. Багато хто може користуватися алгоритмом AES. Це призводить до впізнаваності коду під час спроби розшифровки, наприклад, хакерами.
Отже, що може бути кращою альтернативою? Власний код із власним шифруванням даних. Про це детальніше нижче.
Що якби кожному стандартному символу, який можна набрати на клавіатурі, присвоїти певний код? Буквений або цифровий.
За основу я взяв усі клавіатурні символи — літери, цифри та спеціальні символи:
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890!@#$%^&*()_+-=`~'";:<>[]{}/|,.
і попросив ChatGPT присвоїти кожному символу тризначний цифровий код у випадковому порядку за умови відсутності дублікатів (мені самому вручну це робити ліньки).
Вийшов такий список:
A - 342
B - 126
C - 587
D - 943
E - 208
F - 375
G - 691
H - 462
I - 109
J - 832
K - 504
...
(я не буду копіювати його повністю)
Після цього пишемо скрипт у розмітці JavaScript, який виконує кодування та декодування тексту згідно з встановленими умовами. У результаті ми отримуємо просто набір цифр у великій кількості, при розшифруванні якого тим же власним способом отримаємо вихідний текст. Під час роботи над помилками я додав символ пробілу та символ перенесення рядка — \n.
Ідея мені сподобалася ще до реалізації, результат — теж.
Заходи безпеки
До зашифрованого тексту слід ставитися дбайливо, як до будь-якого пароля. Якщо видалити хоча б один символ із зашифрованого тексту, його розшифрувати не вдасться. Якщо дописати хоча б один символ — те саме. Отже, розділяти текст пробілами та перенесеннями рядків — не можна. Втім, все ті ж правила безпеки, що й із секретним ключем до криптовалютного гаманця. Під час розшифрування скрипт зчитує кожні три символи коду та перетворює їх у текст, цифри, пробіли.
Тризначний цифровий код не обов’язково має складатися лише з цифр. Його можна змінити на буквено-цифровий або тільки з букв. Можна збільшити кількість символів у коді. Це значно підвищить рівень безпеки шифрування тексту.
Повний скрипт:
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Кодування та декодування</title>
<style>
body {
background: #eee;
}
textarea {
width: 400px;
height: 200px;
}
#main {
margin: 30px auto;
padding: 30px;
width: 600px;
background: #fff;
}
</style>
</head>
<body>
<div id="main">
<h2>Кодування тексту</h2>
<textarea id="encode" placeholder="Введіть текст для кодування..."></textarea>
<button onclick="encodeText()">Кодувати</button>
<hr size="1">
<h2>Розкодування тексту</h2>
<textarea id="decode" placeholder="Введіть закодований текст..."></textarea>
<button onclick="decodeText()">Розкодувати</button>
<div>
<br /><br />
<b><u>Допустимі до використання символи</u>:</b><br /><br />
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz<br />
1234567890<br />
!@#$%^&*()_+-=`~'";:<>[]{}/\|,.<br />
пробіл, перенос рядку
</div>
</div>
<script>
// Таблиця кодування
const codeTable = {
'A': 342, 'B': 126, 'C': 615, 'D': 943, 'E': 208, 'F': 375, 'G': 691, 'H': 462, 'I': 653, 'J': 832,
'K': 504, 'L': 215, 'M': 348, 'N': 728, 'O': 156, 'P': 101, 'Q': 237, 'R': 409, 'S': 516, 'T': 721,
'U': 154, 'V': 664, 'W': 307, 'X': 930, 'Y': 578, 'Z': 287, 'a': 731, 'b': 293, 'c': 587, 'd': 645,
'e': 190, 'f': 458, 'g': 803, 'h': 324, 'i': 567, 'j': 412, 'k': 185, 'l': 934, 'm': 209, 'n': 572,
'o': 252, 'p': 384, 'q': 617, 'r': 850, 's': 456, 't': 139, 'u': 445, 'v': 299, 'w': 740, 'x': 732,
'y': 345, 'z': 859, '0': 193, '1': 574, '2': 806, '3': 259, '4': 437, '5': 618, '6': 920, '7': 134,
'8': 752, '9': 463, '!': 370, '@': 519, '#': 603, '$': 658, '%': 312, '^': 107, '&': 275, '*': 983,
'(': 641, ')': 517, '_': 408, '+': 201, '-': 730, '=': 592, '`': 379, '~': 804, "'": 257, '"': 695,
';': 309, ':': 583, '<': 109, '>': 467, '[': 521, ']': 308, '{': 748, '}': 925, '/': 136, '\\': 807,
'|': 529, '.': 746, ',': 387, ' ': 911, ' ': 922, '\n': 933
};
// Розкодування
const decodeTable = Object.fromEntries(
Object.entries(codeTable).map(([char, code]) => [code, char])
);
// Функція кодування
function encodeText() {
const inputText = document.getElementById('encode').value;
const encodedText = inputText
.split('')
.map(char => codeTable[char] ? codeTable[char] : char)
.join('');
document.getElementById('decode').value = encodedText;
}
// Функція розкодування
function decodeText() {
const inputText = document.getElementById('decode').value;
let decodedText = '';
for (let i = 0; i < inputText.length; i += 3) {
const code = inputText.slice(i, i + 3); // Виділяємо кожні три символи
decodedText += decodeTable[code] ? decodeTable[code] : '?'; // Додаємо символ або знак "?" якщо код невідомий
}
document.getElementById('encode').value = decodedText;
}
</script>
</body>
</html>
Не знаєте як це реалізувати? Просто вставити код у блокнот і зберегти на комп'ютері у файл з розширенням .html
Потім відкрити.
Сподіваюся, хтось знайде застосування моїм розробкам, щонайменше як ідеям.
Не думаю, що це параноя, зважаючи на сучасні ризики 😅
Я теж досить прискіпливо ставлюсь до зберігання паролей)
Скоріш за все так і треба 🤷♂️😁
Дякую 🙏🏻