【Unity】【C#】文字列の暗号化・復号化を簡単に行う 
2020/01/30 Thu [edit]
今回は手軽にデータの暗号化・復号化が行える「Unity Cipher」というオープンソースライブラリを紹介しよう。
実際にはコードを見てみると、特に Unity 以外でも使えそうだが、デモ(Examples)が Unity で作られているからだろうか?とても簡単で強固なセキュリティが確保できるので、パスワードや何らかのアカウントデータなどを扱うアプリなら、導入を検討した方が良いだろう。
詳しい内容などはライブラリ作者直々の記事があるので、そちらを参考にして欲しい。ここではどちらかと言うとオープンソースライブラリなど、余りサードパーティを利用したことのない人のためにも、細かい導入手順を書いておく。
・Unity(C#) で「正しい」暗号化処理をするライブラリを作成しました
(※) Unity 2019.2.18f1 / Windows10(x64) で確認
※掲載時点 1.2.0 では 2019.2.17f1 で作られているようだが、コードにバージョン依存性はあまり無いと思うので、少し古い Unity バージョンでも問題なく使えると思う(少なくとも Unity2017 では使えた)。
■ライブラリのインポート
まずは github でライブラリをダウンロードしよう。「Clone or download」から zip をダウンロードできるので、落としたら解凍して、「UnityCipher.unitypackage」を Unity にインポートする(プロジェクトビューにドラッグ&ドロップすると楽)。
・Unity Cipher (MIT License)

インポートできたら、「Assets/UnityCipher/Plugins/UnityCipher/」フォルダにある cs ファイルがライブラリ本体となる。
デモ(Assets/UnityCipher/Examples/ 以下)が必要無いなら、これらファイルだけ導入しても構わない。

ちなみに「Plugins」フォルダに入れておくことは、スクリプトのコンパイル順に関係する事なので、汎用的なライブラリは Plugins 以下に配置されていることが多い → UniRx(AssetStore版)等
・特殊フォルダーとスクリプトのコンパイル順 (Unity Manual)
簡単な使い方はデモを見るのが早いかも知れない。「Assets/UnityCipher/Examples/ 」に「Example」シーンがあるので、起動してみると良いだろう。

オススメは「Rijndael」だ。サンプルコード上では「Examples/Scripts」フォルダ以下の「RijndaelContent.cs」を開けば、だいたい使い方がわかると思う。例えば、暗号化・復号化の部分を抜き出せば次のようになる。
●UnityCipher での暗号化・復号化
using UnityCipher;
//暗号化
string encrypted = RijndaelEncryption.Encrypt(planeText, passwordText);
//復号化
string plane = RijndaelEncryption.Decrypt(encryptedText, passwordText);
encrypted = I8WWDJbFzGCN4OiauU7H1w2PSOTCFDZUIMXD000pA3bq4T4g06lNvzxSlW8qQEMF4agkUfrnFfL4eXRd9AtaSlI2TZpuwZF7dH1+sYwaNBvOty2ImJJuaqVWEdWbjfB6
(次に、暗号化[エンコード]された文字列(encrypted)を復号化すると[→ passwordText は同じものを使う])
plane = "hogehoge"
このライブラリの優れた所は、デモでもう一度同じ文字列を暗号化して貰えるとわかると思うが、毎回違う文字列が生成される点だ(ライブラリ作者の記事に詳しく書いてある)。つまり文字列の並びから中身は想定はされずらいので、セキュリティ的にも安全性が高くなる(世の中には本当に凄い人もいるもので、実際に学会などで新しい暗号化方式を、何度かパターンを見ただけでやぶってしまう人もいるという…)。
また注意点としては、当たり前だがパスワードは難しいものにしておいてね…と(笑)("password" とか "admin" とかはダメですよ(笑))。
Unity においては例えば PlayerPrefs に使っても良いかも知れない。ただし、文字列が長くなるので、Android/iOS には大量にやらない方が良いかも(Android は ~.xml, iOS は ~.plist に書き出されるため)。もしキーと値を両方暗号化したいなら、キーには「ハッシュ値」を使うのもアリだろう。
・【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する
・【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表
また、github の Usage にも書いてあるが、byte[] も使えるので、バイナリデータを暗号化するにも良いだろう。使い方は同様なので難しくはないと思う。
(関連記事)
【C#】MD5, SHA1, SHA256, SHA384, SHA512 等のハッシュ値を生成する
【C#】GUID の生成と書式
【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/345-e3a084f2
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |