Как зашифровать имя пользователя и пароль во флаттере

Я пытаюсь реализовать шифрование phone_number и пароля во флаттере. после попытки зашифровать jsonbody "( var rBody = jsonEncode({ 'Request': encryptor.encrypt(requestBody.toString())});", а затем запустить приложение, я все еще не могу передать запрос на мой удаленный сервер ( который требует, чтобы все запросы были зашифрованы с помощью AES). Может ли кто-нибудь с опытом в этом показать мне лучший способ сделать это, чтобы пароль и телефон были зашифрованы эффективно.

import 'dart:async';
import 'dart:convert';
import 'package:encrypt/encrypt.dart';
import 'package:http/http.dart' as http;



  Future<http.Response> post() async {
var url = 'http:xxxxxxxpostRequest';
String password = "xxxxxxx";//url password
String username = "xxxxx";//access username

var bytes = utf8.encode("$username:$password");


var credentials = base64.encode(bytes);
var headers = {
  "Content-Type": "application/json",
  "Authorization": "Basic $credentials"
};

var requestBody = jsonEncode({ 'phone': _phone, 'pin': _pass});

final key = "";// encryption key
final iv= "";

final encryptor=new Encrypter(new Salsa20(key, iv));


var rBody = jsonEncode({ 'Request': encryptor.encrypt(requestBody.toString())});


http.Response response = await http.post(
    url, body: rBody, headers: headers);
var responseJson = json.decode(response.body);
print(Utf8Codec().decode(response.bodyBytes));

print("Body: " + responseJson);

}

//Это мой консольный ответ

E/flutter (24909): [ОШИБКА:topaz/lib/tonic/logging/dart_error.cc(16)] Необработанное исключение: E/flutter (24909): тип «ParametersWithIV» не является подтипом типа «ParametersWithIV» E/


comment
Требует ли сервер AES или Salsa20? Если AES, то какие алгоритмы блокировки и заполнения? Си-Би-Си? PKCS5Подкладка?   -  person Richard Heap    schedule 30.09.2018
comment
Привет, Ричард, я использую дополнение CBC/PKCS5   -  person denis    schedule 30.09.2018
comment
Как вы знаете, ключи AES обычно имеют длину 128 или 256 бит, а IV — 128 бит. Как сервер ожидает, что вы получите ключ и IV из строк, которые вы показываете в своем фрагменте?   -  person Richard Heap    schedule 30.09.2018
comment
строки не являются точными ключами. У меня есть точные строки. я спрашиваю, каков эффективный способ сделать это. например, рабочий пример, использующий тот же формат.   -  person denis    schedule 30.09.2018
comment
Строки у вас в шестнадцатеричном формате? Вы должны сначала преобразовать их в байты. Команда сервера сказала вам, как они ожидают, что вы конвертируете их в 16 байт?   -  person Richard Heap    schedule 30.09.2018
comment
Да, но меня просто беспокоит, как вы должны построить код шифрования в дротике. не могли бы вы поделиться примером независимо от ключевых строк, пожалуйста?   -  person denis    schedule 30.09.2018
comment
Просто быстрый вопрос: я предполагаю, что вы публикуете URL-адрес https. Если POST уже зашифрован с помощью SSL/TLS, зачем нам еще раз шифровать его?   -  person Philip    schedule 10.01.2020


Ответы (1)


Пакет encrypt плохо поддерживается, поэтому используйте пакет pointy castle. (Используйте pointycastle: ^1.0.0-rc3.)

Ваш вопрос не ясен о том, как вы собираетесь:

  • получить ключевой материал из предоставленных строк
  • преобразовать открытый текст в байты
  • преобразовать зашифрованный текст обратно во что-то, что вы можете включить в json

Возможно, они могут быть закодированы в шестнадцатеричном формате или base64. Ваша серверная команда должна иметь возможность указать, что они хотят.

Вот пример кода для шифрования в AES/CBC/PKCS7.

import 'dart:convert';
import 'dart:typed_data';

import 'package:pointycastle/api.dart';
import 'package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart';
import 'package:pointycastle/paddings/pkcs7.dart';
import 'package:pointycastle/block/aes_fast.dart';
import 'package:pointycastle/block/modes/cbc.dart';

main() {
  //final key = 'dxxxxxxxxxxeX';
  //final iv = '_Vxxxxxxxxxx1';

  // TODO - convert the key and IV to bytes
  // dummy key and IV values
  Uint8List key = Uint8List.fromList(
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
  );
  Uint8List iv = Uint8List.fromList(
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
  );

  // TODO - convert the plaintext to bytes
  // example - just utf8 encode it
  Uint8List plainText = Uint8List.fromList(utf8.encode('some plain text'));

  PaddedBlockCipher cipher = PaddedBlockCipherImpl(
    PKCS7Padding(),
    CBCBlockCipher(AESFastEngine()),
  );

  cipher.init(
    true,
    PaddedBlockCipherParameters<CipherParameters, CipherParameters>(
      ParametersWithIV<KeyParameter>(KeyParameter(key), iv),
      null,
    ),
  );
  Uint8List cipherText = cipher.process(plainText);
  // TODO - convert the cipher text to a String to include as the 'Request' param
}

PS Не забывайте, что повторно использовать один и тот же IV более одного раза небезопасно.

person Richard Heap    schedule 30.09.2018