现实需求
登录的时候需要输入用户名和密码。密码不能直接传给后台,应该先进行加密。
常用的加密方式有对称加密:比如AES;不对称加密:比如RSA
这里选用的是RSA不对称加密方式
插件
一般情况,这种加解密用第三方插件比较多,很少自己写。
- 引入
encrypt: ^5.0.1
- 使用
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';
class EncryptUtil {
/// 加密
static String encryption(String content, String publicKeyString) {
final parser = RSAKeyParser();
RSAPublicKey publicKey = parser.parse(publicKeyString) as RSAPublicKey;
final encrypter = Encrypter(RSA(publicKey: publicKey));
return encrypter.encrypt(content).base64;
}
}
公钥
-
一种方式是以.pem文件的格式放在本地,那么就有一个读取.pem文件的过程
-
另外一种是以接口的形式从后台拿,一般这种方式比较普遍。这个时候,需要在后台给的公钥字符串前后添加头和尾。
pubKeyString = '''
-----BEGIN PUBLIC KEY-----
$pubKeyFromBackground
-----END PUBLIC KEY-----
''';
关于接口
一般来说,加解密,只要一个字符串变换的函数就可以了,但是这个插件却引入很多自定义的类,所以需要转变一下思路。
- RSAPublicKey;RSAPrivateKey;RSAKeyParser
这几个是用来处理RSA加解密中的秘钥的。读取.pem文件,或者从后台拿,扥到的公钥一般是字符串的格式。RSAKeyParser的作用就是将字符串格式的公钥转变为RSAPublicKey结构。
- RSA这个结构代表RSA加解密算法。从它的构造函数可以看出,有公钥,私钥,编码方式几个参数。对于客户端来说,大多数情况,只要一个公钥RSAPublicKey就可以了。
RSA(
{RSAPublicKey? publicKey,
RSAPrivateKey? privateKey,
RSAEncoding encoding = RSAEncoding.PKCS1})
-
Encrypter这个结构可以看做是加解密的具体执行者,其构造函数需要提供一个算法,比如上面提到的RSA
-
Encrypted加密后的产物。这里要注意的是这并不是通常所理解的加密字符串。需要再增加一步,调用其get方法base64才能得到base64格式的加密字符串。
一个字符串到字符串之间变换,中间经过了这么多自定义的类,所以需要花点时间消化一下。
参考文章
encrypt: ^5.0.1;
Flutter RSA加密解密的示例代码
其他插件
-
这个插件就支持RSA
-
有点是接口简单好用:
//Encrypt string by public key,the public key is String (使用公钥加密字符串,公钥是字符串)
var str1 = await MzRsaPlugin.encryptStringByPublicKey(originText, PUBLICK_KEY);
// Decrypt the encrypted string by private key, the private key is String(使用私钥解密公钥加密过的字符串,私钥是字符串)
var str2 = await MzRsaPlugin.decryptStringByPrivateKey(str1, PRIVART_KEY);
-
在iOS下可以正常使用,但是据说在Android下回崩溃,原因还不知道。所以这个插件的流行程度不如encrypt
网友评论