Шифрование данных, которые будут расшифрованы позже - PullRequest
1 голос
/ 26 июня 2019

Я создаю метод для расчета цены обновления пакета подписки с использованием полосы.Stripe имеет встроенную функцию и производит цену пропорционального расчета, вычисляемую во время запроса, известную как значение «proration_date».

Если клиент соглашается с ценой, пользователь может приобрести ее по указанной цене, предполагая, чтоЯ передаю «proration_date» вместе со следующим запросом.

Все эти запросы выполняются на внутреннем сервере, и из-за ограничений «proration_date» не может храниться в базе данных, что означает, что мне нужно передать его клиентудержать.

Чтобы решить эту проблему, я хотел бы передать зашифрованный токен клиенту, который будет содержать дату proration_date.Затем в запросе на оплату я бы взял зашифрованный токен и расшифровал его на своем сервере.

Я пробовал и проверял код с здесь , и он, кажется, работает.Также показана база кода.

Это метод шифрования, достаточно безопасный для моей задачи?

function encrypt(text) {
 let iv = crypto.randomBytes(IV_LENGTH);
 let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
 let encrypted = cipher.update(text);

 encrypted = Buffer.concat([encrypted, cipher.final()]);

 return iv.toString('hex') + ':' + encrypted.toString('hex');
}

function decrypt(text) {
 let textParts = text.split(':');
 let iv = Buffer.from(textParts.shift(), 'hex');
 let encryptedText = Buffer.from(textParts.join(':'), 'hex');
 let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
 let decrypted = decipher.update(encryptedText);

 decrypted = Buffer.concat([decrypted, decipher.final()]);

 return decrypted.toString();
}

1 Ответ

0 голосов
/ 26 июня 2019

Вы используете криптомодуль как и предполагалось.Однако существуют простые способы сломать AES в режиме CBC, см., Например, http://cryptopals.com/sets/2/challenges/16 или http://cryptopals.com/sets/3/challenges/17. Первая атака изменяет обычный текст с помощью зашифрованного текста, а вторая демонстрирует, каким образом зашифрованный текст может бытьрасшифровывается без ключа.

Урок заключается в том, что конфиденциальность является лишь одним аспектом криптографии;Вы также хотите целостность данных.То есть вы хотите определить, не был ли подделан входящий фрагмент данных клиента.

Могу ли я предложить вам ознакомиться с этой лекцией, чтобы узнать о кодах аутентификации сообщений (MAC): https://www.youtube.com/watch?v=DiLPn_ldAAQ.Учебник лектора Кристофа Паара также очень доступен.

...