【问题标题】:how to decrypt a base 64 string?如何解密base 64字符串?
【发布时间】:2021-10-14 16:40:00
【问题描述】:

我将解释我的问题,我正在尝试加密密码,然后将其保存在本地,以便我可以在必要时去检索它,解密它并将其分配到我想要的任何地方。 在加密阶段我没有遇到任何问题,因为加密方法可以轻松返回字符串,而在解密方法中我有问题,因为返回类型似乎必须是加密类型。

通过这样做,我不可能通过 sharedPreferences 将字符串保存在本地并能够解密它,我将提供以下代码以更好地理解我的问题:

class _State extends State<SettingsPage> {
  static final key = encrypt.Key.fromLength(32);
  static final iv = encrypt.IV.fromLength(16);
  static final encrypter = encrypt.Encrypter(encrypt.AES(key));

  static encryptAES(text) {
    final encrypted = encrypter.encrypt(text, iv: iv);
    return encrypted;
  }

  static decryptAES(text) {
    print(text.base64);
    String decrypted = encrypter.decrypt(text, iv: iv);
    print(decrypted);
    return decrypted;
  }

 SettingsPage.inputPassword = input[0];
                      // SettingsPage.inputPassword = tec.text;
                      encryptedText = encryptAES(SettingsPage.inputPassword).base64;

                      setState(() {
                        String encryptedText =
                            encryptAES(SettingsPage.inputPassword).base64;
                        print("PROVA ENCRYPTED TEXT " + encryptedText);
                      });

                      prefs.setString('savedPass', encryptedText.base64);
                      String decryptedText = decryptAES(encryptedText).base64;
                      print("PROVA TESTO DECRIPTATO " + decryptedText);
                    }
                  },

一切都按要求进行,直到密码被保存,然后我问你如何解密一个字符串,以便能够正确地将变量 DecryptedText 分配给 String 变量,因为此时我被告知:

Unhandled Exception: NoSuchMethodError: Class 'String' has no instance getter 'base64'.

这是因为解密的方法似乎只能返回一个 Encrypt 类型。 使用的 pub.dev API 是加密的:^5.0.1。 谢谢。

【问题讨论】:

  • 你为什么要这样做?
  • 我需要解密它才能在登录时使用它。
  • 您认为这是一个安全的解决方案吗?你不能使用某种 api_token 之类的吗?
  • 为什么它不应该是一个安全的解决方案?我不知道该怎么做我问...
  • 要将 Base64 编码的密文转换为 Encrypted 对象,只需使用 Encrypted.from64()

标签: flutter dart encryption mobile


【解决方案1】:

我不熟悉package:encrypt,但浏览一下文档,您应该使用Encrypted.fromBase64 构造一个Encrypted 对象以传递给Encrypter.decrypt

static String decryptAES(String base64Text) {
  print(base64Text);
  String decrypted = encrypter.decrypt(Encrypted.fromBase64(base64Text), iv: iv);
  print(decrypted);
  return decrypted;
}

请注意,您也应该只调用decryptAES(...),而不是decryptAES(...).base64。 (您想要原始文本,而不是 base64 编码的版本。)

encryptedTextBase64 = encryptAES(SettingsPage.inputPassword).base64;
...
String decryptedText = decryptAES(encryptedTextBase64);

我会指出您的代码很难遵循(这对于与安全相关的代码尤其不利),因为:

  1. 您的函数既不声明参数类型也不返回类型,因此采用并返回dynamic 类型。这使得很难理解他们期望什么参数以及期望他们返回什么。
  2. 您应该为变量命名以明确哪些是 base64 编码的,哪些不是。 (我在上面的例子中重命名了变量。)

【讨论】:

  • 这是我得到的:方法 'fromBase64' 没有为类型 'Encrypter' 定义。
  • @SimoneSpagnolo 对不起,这是一个错字。我把EncrypterEncrypted 的课程搞混了。我的意思是Encrypted.fromBase64
  • 非常感谢,但我总是遇到同样的错误:未处理的异常:NoSuchMethodError:类'String'没有实例获取器'base64'。在代码的应用程序中我需要更改什么吗?
  • 如我的示例所示,无论您调用decryptAES,都必须删除.base64 调用。这是没有意义的,因为您尝试提取原始字符串,而不是对其进行 base64 编码。
  • 如果您仍然收到错误Unhandled Exception: NoSuchMethodError: Class 'String' has no instance getter 'base64',那么您显然是在某处的String 上调用.base64。别那样做。堆栈跟踪会告诉你有问题的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
相关资源
最近更新 更多