В чем разница между шифрованием, хэшированием и солением?
1 марта 2022 г.Введение
Когда мы обсуждаем аутентификацию пользователей в приложении, мы, следовательно, уже думаем об информационной безопасности и о том, как пользовательские данные будут использоваться и храниться в приложении.
Для достижения более высокого уровня безопасности используются некоторые концепции и методы безопасности, такие как шифрование, хеширование и добавление соли, но у каждого из них есть свое назначение, и в этой статье я представлю концепции, различия и то, как они используются на практике.< /p>
Но в чем разница и когда применять каждый из них?
Концепция
Концепции и методы различаются, поэтому я объясню каждый из них, чтобы вы могли использовать его в своем приложении.
Шифрование
Шифрование — это процесс преобразования данных с использованием ключа доступа с возможностью их восстановления. Шифрование является двусторонним (двунаправленным) процессом, то есть можно шифровать данные и расшифровывать одни и те же данные, используя один и тот же ключ доступа. Существует несколько известных типов шифрования, таких как AES (Advanced Encryption Standard), RSA (Rivest-Shamir-Adleman) и другие.
Хеширование
Хеширование — это процесс преобразования данных без необходимости их извлечения, а типы хэшей имеют одинаковую длину независимо от преобразованных данных. Хеширование — это односторонний (однонаправленный) процесс, то есть данные можно зашифровать, но нельзя расшифровать. Известны некоторые типы хеширования, такие как MD5, SHA1, SHA256, SHA512 и другие.
Соление
Посол — это процесс добавления случайных данных при преобразовании данных с использованием хеширования. Существует несколько типов солей, известных как scrypt, bcrypt, Argon2 и другие. Этот процесс часто используется при хранении паролей в базе данных.
Практика
Примеры, используемые на практике, будут разработаны с использованием Node.js и модуль шифрования.
Шифрование
Практический пример использования шифрования — обмен данными между двумя приложениями, когда приложение A шифрует данные и отправляет эти зашифрованные данные приложению B, где это взаимодействие может осуществляться с помощью базы данных или HTTP-запроса, и приложением B. расшифровывает данные для использования. В этом примере ключ доступа должен находиться в приложениях A и B.
В модуле шифрования есть два класса: Cipher и < href="https://nodejs.org/api/crypto.html#class-decipher">Decipher, который мы собираемся использовать в примере.
1. Создайте папку приложения.
mkdir nodejs-encryption
cd nodejs-encryption
2. Создайте файл package.json
. Опция -y
позволяет создать файл без вопросов, таких как имя приложения, версия и другие.
npm init -y
3. Создайте папку src
и создайте файл index.js
внутри папки src
.
mkdir src
touch src/index.js
4. Добавьте содержимое ниже в файл src/index.js
.
const { createCipheriv, createDecipheriv } = require('crypto');
const algorithm = 'aes-256-cbc';
const key = 'REtgV24bDB7xQYoMuypiBASMEaJbc59n';
const iv = '8d2bc3f0f69426fc';
const encrypt = (data) => {
const cipher = createCipheriv(algorithm, key, iv);
let crypted = cipher.update(data, 'utf8', 'hex');
crypted += cipher.final('hex');
return crypted;
};
const decrypt = (data) => {
const decipher = createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(data, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
};
const data = 'Some data plain';
const dataEncrypt = encrypt(data);
const dataDecrypt = decrypt(dataEncrypt);
console.log(`Data=[${data}]`);
console.log(`Data encrypted=[${dataEncrypt}]`);
console.log(`Data decrypted=[${dataDecrypt}]`);
Примечания:
* createCipheriv
: этот метод создает и возвращает объект типа Cipher. Аргументы:
* алгоритм
: алгоритм шифрования AES (Advanced Encryption Standard).
* key
: ключ доступа. Длина ключа зависит от типа алгоритма, который будет использоваться.
* iv
(вектор инициализации): любое значение, которое используется один раз на стороне отправителя и получателя. Длина iv зависит от типа алгоритма, который будет использоваться.
* createDecipheriv
: этот метод создает и возвращает объект типа Decipher. Аргументы:
* алгоритм
: тип алгоритма дешифрования AES (Advanced Encryption Standard).
* key
: ключ доступа. Длина ключа зависит от типа алгоритма, который будет использоваться.
* iv
(вектор инициализации): любое значение, которое используется один раз на стороне отправителя и получателя. Длина iv зависит от типа алгоритма, который будет использоваться.
* update
: этот метод обновляет шифрование или расшифровку данных. Аргументы:
* data
: данные, которые будут зашифрованы или расшифрованы.
* inputEncoding
: кодировка ввода данных.
* outputEncoding
: кодировка вывода данных.
* final
: этот метод возвращает зашифрованные или расшифрованные данные. Строка возвращается, когда сообщается о кодировке, в противном случае будет возвращен буфер.
5. Запустите приложение с помощью приведенной ниже команды.
node src/index.js
Data=[Some data plain]
Data crypted=[4ee8b9fd43c94019edebafc2d6374c82]
Data decrypted=[Some data plain]
Примечания:
* Данные Some data plain были переданы методу encrypt
, и этот метод зашифровал данные, создав значение 4ee8b9fd43c94019edebafc2d6374c82
.
* Значение 4ee8b9fd43c94019edebafc2d6374c82
было передано в метод decrypt
, и этот метод расшифровал значение, создав данные Some data plain.
6. Готово! Мы создали пример шифрования и дешифрования данных.
Репозиторий приложений доступен по адресу https://github.com/rodrigokamada/nodejs-encryption. .
Хеширование
Практический пример использования хеширования — сохранение пароля пользователя в базе данных путем применения типа хеширования. Всякий раз, когда пользователь вводит пароль на странице входа, хэш пароля сравнивается с хешем, хранящимся в базе данных.
В модуле шифрования есть класс Hash, который мы собираемся использовать в примере.
1. Создайте папку приложения.
mkdir nodejs-hashing
cd nodejs-hashing
2. Создайте файл package.json
. Опция -y
позволяет создать файл без вопросов, таких как имя приложения, версия и другие.
npm init -y
3. Создайте папку src
и создайте файл index.js
внутри папки src
.
mkdir src
touch src/index.js
4. Добавьте содержимое ниже в файл src/index.js
.
const { createHash } = require('crypto');
const crypt = (data) => {
const hash = createHash('sha256');
hash.update(data);
return hash.digest('hex');
};
const data = 'Some data plain';
const dataCrypt = crypt(data);
console.log(`Data=[${data}]`);
console.log(`Data crypted=[${dataCrypt}]`);
Примечания:
* createHash
: этот метод создает и возвращает объект типа Hash. Аргументы:
* алгоритм
: тип алгоритма, поддерживаемый версией OpenSSL.
* update
: этот метод обновляет хэш данными. Аргументы:
* data
: данные, которые будут преобразованы в хэш.
* digest
: этот метод возвращает данные, преобразованные в хэш. Когда сообщается кодировка, возвращается строка, в противном случае будет возвращен буфер.
5. Запустите приложение с помощью приведенной ниже команды.
node src/index.js
Data=[Some data plain]
Data crypted=[039ee8ef355ee07c345fe6feaa22d6c1bf34ac91eb45abb80602c59deb5d34e7]
Примечание.
* Данные Some data plain были переданы методу crypt
, и этот метод преобразовал данные, создав значение 039ee8ef355ee07c345fe6feaa22d6c1bf34ac91eb45abb80602c59deb5d34e7
.
6. Готово! Мы создали пример для преобразования данных в хеш.
Репозиторий приложений доступен по адресу https://github.com/rodrigokamada/nodejs-hashing. .
Соление
Практический пример использования солей — хранение пароля пользователя в базе данных, где вместе с паролем добавляются случайные данные, а затем применяется тип хэша.
В модуле шифрования есть метод, который называется scrypt которую мы собираемся использовать в примере.
1. Создайте папку приложения.
mkdir nodejs-salting
cd nodejs-salting
2. Создайте файл package.json
. Опция -y
позволяет создать файл без вопросов, таких как имя приложения, версия и другие.
npm init -y
3. Создайте папку src
и создайте файл index.js
внутри папки src
.
mkdir src
touch src/index.js
4. Добавьте содержимое ниже в файл src/index.js
.
const { scryptSync } = require('crypto');
const salt = 'some-salt';
const keyLength = 64;
const crypt = (data) => {
const derivedKey = scryptSync(data, salt, keyLength);
return derivedKey.toString('hex');
};
const data = 'Some data plain';
const dataCrypt = crypt(data);
console.log(`Data=[${data}]`);
console.log(`Data crypted=[${dataCrypt}]`);
Примечания:
* scryptSync
: этот метод преобразует данные в хэш. Аргументы:
* data
: данные, которые будут преобразованы в хэш.
* salt
: случайные данные.
* keyLength
: длина ключа.
* toString
: этот метод преобразует тип из буфера в строку.
5. Запустите приложение с помощью приведенной ниже команды.
node src/index.js
Data=[Some data plain]
Data crypted=[2b57498b290aa7d31741dc71b60f59f9b5f59431c842500502704f0d7e7b8204293b13bcb8ee54ef2f4f8c99711f27c42144d1c46d5c44362bd5a6748bf7a1bc]
Примечание.
* The Some data plain data was passed to the crypt
method and this method converted the data generating the value 2b57498b290aa7d31741dc71b60f59f9b5f59431c842500502704f0d7e7b8204293b13bcb8ee54ef2f4f8c99711f27c42144d1c46d5c44362bd5a6748bf7a1bc
.
6. Готово! Мы создали пример для преобразования данных в хэш с использованием соли.
Репозиторий приложений доступен по адресу https://github.com/rodrigokamada/nodejs-salting. .
Заключение
После представления концепций и использования на практике шифрования, хеширования и соления, даже если все связано с безопасностью, у каждого из них есть свое предназначение и усиление всего этого:
* Шифрование — это двусторонний процесс, позволяющий шифровать и расшифровывать данные, используемые при обмене данными между двумя приложениями. * Хеширование – это односторонний процесс, позволяющий проверить подлинность и целостность данных, используемых при хранении пароля пользователя. * Salting – это процесс добавления случайных данных к хэшированию, которое также используется для хранения пароля пользователя.
Понимание концепций безопасности и реализация методов безопасности очень важны для обеспечения безопасности вашего приложения или системы.
Это руководство было опубликовано в моем блоге. на португальском языке.
Оригинал