Encryption with private key in RSA using Dart

Photo by Debby Hudson on Unsplash

どうしても RSA Private key を使用して署名をしなきゃいけない案件があったのでやりました.

使用したライブラリは下記です.
死ぬほど助かりました.

encrypt | Dart Package

このライブラリを選択したのは parseKeyFromFile が用意されていたからです.
ほかにも似たライブラリはあるんですが,KeyPair をジェネレートまたは JWT から生成しかなさそうでした.
今回は環境変数に base64 エンコードした key をセットして再署名していきます.

Future<T> parseKeyFromFile<T extends RSAAsymmetricKey>(String filename) async {
   final file = File(filename);
   final key = await file.readAsString();
   final parser = RSAKeyParser();
   return parser.parse(key) as T;
}

というわけでコード.

import 'package:encrypt/encrypt.dart';var key = bool.hasEnvironment('PRIVATE_KEY')
    ? String.Environment('PRIVATE_KEY')
    : '';def sign() {
  var parser = RSAKeyParser();
  var privateKey = parser.parse(utf8.decode(base64.decode(key)));
  var signer =
      Signer(RSASigner(RSASignDigest.SHA256, privateKey: privateKey));
  var content = 'This is content.'
  return signer.sign(content).base64;
}

Flutter web で問題なく動いたので Android ・ iOS も動きそうな気がします.