В чем разница между шифрованием, хэшированием и солением?

В чем разница между шифрованием, хэшированием и солением?

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 – это процесс добавления случайных данных к хэшированию, которое также используется для хранения пароля пользователя.

Понимание концепций безопасности и реализация методов безопасности очень важны для обеспечения безопасности вашего приложения или системы.

Это руководство было опубликовано в моем блоге. на португальском языке.


Оригинал