Шифрование AES во flutter

#encryption #dart #flutter #aes #password-encryption

#шифрование #dart #flutter #aes #шифрование паролем

Вопрос:

Я хочу использовать AES-шифрование данных для http-запросов во flutter. У меня есть пароль и строка открытого текста, которую я хочу зашифровать. Я использую flutter_string_encryption. Я добился этого в приложении для iOS, но оба результата отличаются.

 final salt = await cryptor.generateSalt();
final generatedKey = await cryptor.generateKeyFromPassword(password, salt);
final String encrypted = await cryptor.encrypt(string, generatedKey);
  

Комментарии:

1. Если целью является шифрование сетевого вызова. Я бы рекомендовал протокол TLS (HTTPS), который решил бы проблему. Вам также нужно будет закрепить сертификат / PubKey в приложении, чтобы сделать его полностью защищенным.

2. На самом деле требуется зашифровать данные в запросе. Но сравнение зашифрованного текста отличается. Я думаю, это из-за final salt = await cryptor.GenerateSalt(); соль генерируется случайным образом.

3. Да, должно быть известно, что salt шифрует / расшифровывает на обоих концах.

4. Не удалось получить зашифрованные данные, можете ли вы предложить некоторые источники для того же?

Ответ №1:

Есть ли у вас какое-либо конкретное вложение в flutter_string_encryption? Я написал пользовательский пакет, основанный на PointyCastle и полностью написанный на Dart, который может решить AES за вас.

https://pub.dev/packages/steel_crypt

Реализовано примерно так:

 var fortunaKey = CryptKey().genFortuna(); //generate 32 byte key with Fortuna; you can also enter your own
var nonce = CryptKey().genDart(len: 12); //generate IV for AES with Dart Random.secure(); you can also enter your own
var aesEncrypter = AesCrypt(key: fortunaKey, padding: PaddingAES.pkcs7); //generate AES encrypter with key and PKCS7 padding
String encrypted = aesEncrypter.gcm.encrypt(inp: 'somedatahere', iv: nonce); //encrypt using GCM
String decrypted = aesEncrypter.gcm.decrypt(inp: encrypted, iv: nonce); //decrypt
  

Ответ №2:

Ответ AKushWarrior правильный, но если вы не хотите использовать солевой ключ, все в порядке, вы можете напрямую использовать свой ключ шифрования

          encryptionKey ="qwertyuiop";//your encryption key
         var Encrypter = AesCrypt(encryptionKey, 'cbc', 'pkcs7'); 
         //using AES : CBC/ECB , encryptionKey and PKCS7 padding
         EncryptedData = Encrypter.encrypt("hello world");//your data instead of Hello world  
         DecryptedData = Encrypter.decrypt(EncryptedData); 
  

Комментарии:

1. Это серьезно небезопасно. Если вы шифруете с использованием одного и того же ключа более одного раза, вам потребуется IV. security.stackexchange.com/questions/35210 /…