НЕ ИСПОЛЬЗУЙТЕ CRYPTR. Это небезопасно. Я открыл проблему с разработчиком, хотя я не уверен, как это можно исправить без полной перезаписи модуля.
Cryptr использует режим шифрования CTR.Этот режим предназначен для особых случаев использования и не устойчив к атакам податливости.Если содержимое любого зашифрованного сообщения известно, можно преобразовать это сообщение в любое другое сообщение.Например, учитывая зашифрованную строку из примера использования:
const cryptr = new Cryptr('myTotalySecretKey');
const encryptedString = cryptr.encrypt('bacon');
const decryptedString = cryptr.decrypt(encryptedString);
console.log(encryptedString); // "bcb23b81c4839d06644792878e569de4f251f08007"
(Обратите внимание, что зашифрованная строка даже не имеет той длины, которая показана в использовании модуля. Это явная ошибка в ихдокументация.)
Не зная ключа, можно изменить эту строку, чтобы она расшифровывалась как «привет»:
var tmp = Buffer.from(encryptedString, "hex");
var b1 = Buffer.from("bacon"), b2 = Buffer.from("hello");
for (var i = 0; i < b1.length; i++) {
tmp[i + 16] ^= b1[i] ^ b2[i];
}
var ep = tmp.toString("hex");
console.log(ep); // "bcb23b81c4839d06644792878e569de4f855ff8306"
И действительно:
var dp = cryptr.decrypt(ep);
console.log(dp); // "hello"
Это действительно большое дело с точки зрения криптографии.Злоумышленник только что изменил зашифрованное сообщение при передаче, и у вас нет возможности его обнаружить.
Не используйте этот модуль.Если вам нужно переносимое шифрование, используйте библиотеку Sodium ;привязки доступны как для Node, так и для PHP.