Flutter中如何解密Firebase存储的加密字符串?
解决"Encrypt does not accept String value"解密报错问题
问题根源
你在加密时,encryptFernet方法返回的是encrypt.Encrypted实例,存储到Firebase的是该实例的base64属性(字符串格式);但解密时,encrypterFernet.decrypt()方法要求传入的是encrypt.Encrypted对象,直接传入字符串就会触发类型不匹配的报错。
修复方案
修改MyEncryptionDecryption中的decryptFernet方法,先将传入的base64字符串转换为Encrypted对象,再执行解密:
import 'package:encrypt/encrypt.dart' as encrypt; class MyEncryptionDecryption { // For Fernet Encryption/Decryption static final keyFernet = encrypt.Key.fromUtf8('my32lengthsupersecretnooneknows1'); static final fernet = encrypt.Fernet(keyFernet); static final encrypterFernet = encrypt.Encrypter(fernet); static encryptFernet(text) { final encrypted = encrypterFernet.encrypt(text); return encrypted; } // 修改后的解密方法 static decryptFernet(String text) { // 将base64字符串转换为Encrypted对象 final encryptedObj = encrypt.Encrypted.fromBase64(text); return encrypterFernet.decrypt(encryptedObj); } }
调用示例
现在你可以直接传入从Firebase获取的字符串进行解密,无需额外转换:
final service = userData[index]; final cardNum = service.cardNum; var finalCardNum = MyEncryptionDecryption.decryptFernet(cardNum);
补充说明
加密时通过encryptCardNum.base64将加密结果转为base64字符串存储,解密时就必须通过Encrypted.fromBase64()将字符串还原为Encrypted实例,才能被解密方法识别处理。
内容的提问来源于stack exchange,提问作者Lim
相关产品推荐
相关产品推荐

