Power Appsで文字列を暗号化したいなと思い、ちょっと調べてみました。

結果は・・・ありませんでした。
唯一、Power Automate for Desktopにだけ、AESを使った暗号化機能が見つかりました。
ですが、クラウド版にはありませんでした。
暗号化技術には色々と規制もあるため、そういった仕様なのかもしれませんが、とりあえずデスクトップ版は今のところ進んで利用する予定はないので、今回は見送ることにしました。
では諦めるのか・・・
というわけにもいかないので、少し考えてみました。
BASE64
Power Appsではなく、Power Automateにはbase64という関数があります。
これはBASE64でエンコードされたデータを文字列にデコードする関数なのですが、残念ながら文字列をBASE64にエンコードする関数がありませんでした。
なので、これは使えないや・・・ということになりました。
URLEncode/URLDecode
これは非アスキー文字を16進数の文字列に置き換えてくれる関数です。
この関数はPower Automateにエンコードとデコードの双方があるので、Power Appsのフロー経由で利用可能でした。
ただし、暗号化というほどのものではないです。
というのも、ASCII文字列(例えばメールアドレスや半角文字列)はすべてそのままなので、パッとみて大体わかってしまうのと、なおかつ簡単にデコードできるので、暗号化とは言えないのです。
バイナリデータは扱えない
Power AppsやPower Automateは、直接バイナリデータを扱うことができません。
そのため、文字列データの難読化や暗号化は難しいのです。
C言語では簡単に扱えますし、Javaでもbyte単位のデータを扱えるのですが、流石にローコードの世界ではバイナリデータを取り扱わせてはもらえないようです。
ではどうしましょうか。
変換テーブルを作る
URLEncodeすれば少なくとも半角のASCII文字列に変換はできるので、これを1文字ずつ、変換テーブルを用意して別の文字に置き換えることで、暗号化が可能です。
ちょっと面倒ですけど。
一般的なASCIIコードで文字として表示可能なものはA〜Z、a〜z、0〜9、その他の記号、そしてスペースです。
おおよそ70文字程度なので、ちょっと頑張れば置換テーブルはできそうです。
もちろん、単純な文字列を利用されるとバレやすいのですが、一応、暗号化することは可能です。
文字と文字コード
Power AppsにはCharという関数があります。
文字コード(数値)を指定すると、文字に置き換えてくれる関数です。
例えば、Char(64)は@、Char(65)はAとなります。
つまり数値を文字に変換できるわけです。
でも逆ができないんですよね。
もし逆ができたらとしたら、文字と文字コードの相互変換ができるので、暗号化っぽいことができそうですが・・・
そこで、まず文字(先ほどの70文字程度のASCII文字)を文字コード(数値:10進数)に置き換える関数を作ることにしました。
(関数そのものは別の機会に紹介します。)
これでChar関数と対になる関数ができたわけです。
16進数への変換
続いて文字コードをどうやって加工するのか。
数値のまま配列に持つことは可能ですが、可搬性が悪いです。
他のアプリケーションに渡すにしてもデータとして渡すにしても不便です。
そこで、せっかく数値に直したわけですが、これを再度文字に直します。
ただし、Text関数を使ってしまうと結局10進数のまま文字列になるだけなので、後でデコードする際に1〜3桁の数字をどうやって切り分けたらいいかわからなくなります。
例えば、
AzF => 6512270(A=65、z=122、F=70)
となってしまうので、どこで文字を区切ればいいかわからない、ということになりかねないわけです。
そこで、10進数ではなく16進数の文字列に変換することにします。
これなら文字コードの範囲であれば2桁で収まるので、2文字ずつ処理をすればデコードできます。
ですが、問題はどうやって16進数の文字列に変換するのか、です。
そんな関数はPower AppsにもPower Automateにもないので・・・自分で作るしかないわけです。
これも後ほど解説しますね。
最後のひと手間
さて、ここまでの暗号化処理をまとめてみます。
- 暗号化したい文字列を、URLEncodeでASCII文字列のみに変換
- 16進数の文字列に変換
これで難読化ができました。
でも、このままだとバレやすいです。
経験のある人なら、16進数の羅列を見たら2文字ずつ区切ってバイトコードとして見るので、あっという間にASCIIコードに置き換えられてしまいます。
そこで、最後のひと手間。
どうにかして16進数の文字列を、パッと見てバイトコードに直してもASCIIコードにならないようにする工夫が必要になります。
その方法は・・・是非考えてみてください。
筆者も一応考えて業務で使っていますが、書いてしまうと簡単にデコードされてしまうので、内緒にしておきます。www
コメント