【解決方法】Flutter mysql_client が暗号化された文字列の正しいデータ型を返さない

[ad_1]

こんにちは、MySQL db (BLOB 列に格納されている) からテキストを復号化しようとしていますが、この問題に遭遇しました。その値を復号化しようとすると、次のエラーが発生しました。

Unhandled Exception: type 'String' 
is not a subtype of type 'Encrypted' in type cast

このエラーは明らかに、戻り値が暗号化されておらず、実際には文字列であるため発生しますが、なぜでしょうか? 取得した値のデータ型が文字列になったのはなぜですか? 暗号化されていませんか?

これは、値が暗号化された方法です

var _encryptCustString = EncryptionModel().aesEncrypt(mykey,"somestring");
  var _tobase64 = _encryptCustString.base64;

値の取得方法と復号化方法

var _getString = await conn.execute("SELECT CustString FROM information WHERE CUST_USERNAME = :username",
      {
        "username": custUsername
      }); 


      Encryption.Encrypted? _valueEnc = null;
      for(var _userPass in _getPass.rows) {
        dynamic _getValue = _userPass.assoc()['CustString'];
        _valueEnc = _getValue;
        var decryptedCust = EncryptionModel().aesDecrypt(mykey,_valueEnc!);

EncryptionModel クラス

import 'package:encrypt/encrypt.dart' as encrypter;

class EncryptionModel {
  encrypter.Encrypted aesEncrypt(String key, var Value) {
    final _getKey = encrypter.Key.fromUtf8(key);
    final encryptServ = encrypter.Encrypter(encrypter.AES(_getKey, mode: encrypter.AESMode.cbc));
    final InitVect = encrypter.IV.fromUtf8(key.substring(0,16));

    encrypter.Encrypted _encryptDat = encryptServ.encrypt(Value,iv: InitVect);
//    dynamic _toEncrypted = _encryptDat.base64;
    return _encryptDat;
  }

  Object aesDecrypt(String key, encrypter.Encrypted EncValue) {
    var _decryptedObj;

    final _getKey = encrypter.Key.fromUtf8(key);
    final encryptServ = encrypter.Encrypter(encrypter.AES(_getKey, mode: encrypter.AESMode.cbc));
    final InitVect = encrypter.IV.fromUtf8(key.substring(0,16));
    
    final _getDecrypt = encryptServ.decrypt(EncValue, iv: InitVect);
    _decryptedObj = _getDecrypt;
    return _getDecrypt;
  }
}

私が試したこと:

(エラーを返します)

Encryption.Encrypted? _valueEnc = null;
     for(var _userPass in _getPass.rows) {
       dynamic _getValue = _userPass.assoc()['CUST_PASSWORD'] as Encryption.Encrypted;
       _valueEnc = _getValue;
       var decryptedCust = EncryptionModel().aesDecrypt("0123456789085746",_valueEnc!);

解決策 1

見つかったドキュメントによると ここ、次のことを試してください –

var source = 'flutter app';
    final decrypted = encrypter.decrypt64(source, iv: iv);

通常の直接復号化では、次のように復号化メソッドを直接使用できます。

final plainText = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
    final iv = IV.fromLength(8);
    final encrypter = Encrypter(Salsa20(key));
    final encrypted = encrypter.encrypt(plainText, iv: iv);
    final decrypted = encrypter.decrypt(encrypted, iv: iv);

上記のように見つかった解決策もあります ここに

[ad_2]

コメント

タイトルとURLをコピーしました