Commentこんにちは!今年もあと残すところ11ヶ月を切ってしまいました。時間が経つのは早いですね・・・。今回はOpenSSLを使って表題の件を検証をしてみたいと思います。先日、とあるファイル共有サービスのログイン情報を含む会員情報が流出すると言うインシデントがあったのは記憶に新しいかと思います。これを書いている2月13日時点では、顧客のファイル自体の流出については報告がありませんが、利用者としては最悪の事態を想定する他ありません。その上で、利用者として、今後この様な事故の被害を最小限に抑えるにはどうしたら良いでしょうか?色々あるかと思いますが、1つは暗号化です。場合インターネット上でファイルを送受信する際には必ず使われている暗号化ですが、今回のケースのように、それを解く為のクレデンシャルが流出していた場合意味がありません。[1]今回の事故以外でも、単に権限をミスったりしてファイルが流出していたなんて事もあります。S3を使おうが一緒です。[2]ファイルを転送する前に自前で更に暗号化をし、更に受信者だけが確実に復号できる仕組みを用意できれば、少しは安心できそうな気がします。言う訳で、長くなりましたが以上が本件を書こうと思った経緯です。暗号化技術にあまり詳しくない方。プログラム等は試験的に実装した物なのでガチでセンシティブなファイルの転送には使わないで下さい。[3]共通鍵暗号と公開鍵暗号インターネット上でよく使う暗号化の方法としては主にこの2種類があると思います。使う鍵が一緒のタイプです。パスワード付きZIPやWi-Fiでもおなじみの、一般的によく使われる暗号化方式かと思います。ちなみにここで言う鍵というのは復号の方法を表す情報と言う事になります。したがって、例えば以下のような物も共通鍵暗号と言えます。特徴としては、(当たり前ですが)暗号化したデータと共に、暗号化に使った鍵もどうにかして転送する必要があります。[5]以下は、OpenSSLでの使用例です。つけると実行する度に異なる結果が得られ安全です(デフォルトで有効)。出力結果を見やすくする為に今回はbase64化して出力しています。続いてこのメッセージを復号してみましょう。対象的に、暗号化と復号で異なる2つの鍵(鍵ペア)を使います。して送信側に渡します。送信者はそれを使い暗号化を行い、受信側に転送します。使って復号を行います。公開鍵暗号では、公開鍵で暗号化したデータは、秘密鍵でしか復号できない為、公開鍵の転送は安全な手段を用いる必要はありません。この性質から、安全にデータの転送が可能となります。[6]因みに有名な公開鍵暗号アルゴリズムのRSAでは、巨大な2つの素数を掛け合わした数値に対する、素因数分解の困難性を安全性の根拠としています。それでは、実際にOpenSSLを使ってそのRSAを使って暗号化&復号を試してみましょう。(0x10001)続いて、この秘密鍵から公開鍵を取り出します。keyそれではこの鍵ペアを使って実際に暗号化を行います。公開鍵を使う事を明示します。エラーとなってしまうので注意が必要です。念の為、本当に公開鍵で復号できないか試してみましょう。operation無事(?)怒られました。やん!共通鍵暗号の存在意義って・・・」と思うかもしれません。公開鍵暗号だけを使うのは難しい理由があります。それは、RSAを使った公開鍵暗号では、もとのメッセージは鍵長以下である必要があると言う制約があるからです。鍵長であれば、256バイトまでのデータしか暗号化できません。11バイト低い、245バイトまでが上限となります。この様な制限から、実際のデータの通信にはRSAは不向きと言えます。そこで、ファイル自体の暗号化にはサイズの制約の少ない共通鍵暗号を使い、その鍵自体を公開鍵暗号を使って暗号化する事で、安全に暗号データと、その復号の為のキーを受信者に送付する事が可能となります。[8]実際にやってみた長くなりましたがいよいよ本題です。長のランダム値を生成。6で受け取った暗号データを、7で復号した「共通鍵」で復号する自分が送信者の場合、事前に受信相手にRSA秘密鍵を生成してもらう必要がありますが、相手がGitHubのユーザーで、かつSSHの認証用にRSAの鍵を登録している場合、手間が省けます。ユーザーが登録している公開鍵は、誰でも参照が可能だからです。AAAAB3NzaC1yc2EAAAADAQABAAACAQC8EfkPUlQE7/z8chnxgmmRX1efaPLO3AKLpXlasPSU/T4eQjahIwz2AC8jowGIXfiUZG2QLgSbMzRkzJC59FAXGzF+ty3VIMMxrA37h2NGuAstr7snzOODx3jph+tJjPZoMx07PGLN4JYysv8eZ/C7ULihdRLBsImQNOStEFNVVm7zNKF0LbvaVuAsbgtpd8L0OaeTWMWEok5K/QRNunnRb6p/q45EyHpN0gWFCByp3pXPu3/QVJTprr/Y1T93uhAZwL1EmB8vHbwAwbb9L/+TOUeY2IXxoykuhhZpXz+0HD9p6iNcv5ABDJNhKMEjjfNq2gKWhc7G2bQwiRT9ELjOvuChBq2ITqw/KaDklORqHK8fzsvPZIe6Rmf9zwNUJPAng360m81kLsWrTiaGA2iR8jKAk0sElPIvNpopFx/VX2rk/RMBptK0zHbZ3X1qFw5ReQ7NFbg3nHSO3po9C463PphDt8HBNoBunzqH40q+XXe7cDvvX4u8ShapJSFdcB1VHUiRm/HRkJaun4Iq2R00oZURcV49NEnB9z2l+0UtqKZHj78l7UBDMe/pa4vrrmbxiUZoB1msrnhrnXW+lytZAHEvTow4RTM5U/14mxbwhs6s4F8ljci4P/0YnH7WBvd9xR/f6M21LM6WWXGvCv+92xYd9DSBjb8z8G35J1Tm1w==尚、この形式のままだとOpenSSLで使えませんので、使える形式に変換しておきます。これに関してはOpenSSHと言う、名前はそっくりですが別のライブラリの機能を使う必要があります。KEY-----これで準備ができました。今回は先述のフローの3〜8までの手順を自動化するBashスクリプトを書きましたのでそちらを使います。実際に、もばらぶのロゴを先程の僕の鍵で暗号化してみましょう。スクリプトで暗号化を行います。この1ファイルの中に、暗号化したAESの鍵と暗号化した本文が含まれているので、後はこのファイルを相手に送付するだけです。それでは受け取り側を想定して復号を行います。./logo.png無事に元のファイル名でファイルが作られました。71869c2dad963c935638ba1f227428d6先ほどと一緒ですね。言う事で、復号は無事にできました!無事復活を遂げたもばらぶロゴおわりに今回、TLS等でも使われている様な、暗号化のフローの一部をOpenSSLを使って検証してみました。今回はシェルスクリプトを使いましたが、OpenSSL用のライブラリがあれば当然他の言語でも実装が可能ですので、興味がある方は試してみて下さい。↩︎どうでもいいですが、暗号化の対語として「復号化」は誤りらしいです。因みに公開鍵暗号は南京錠によく例えられます。優秀な技術者と一緒に、好きな場所で働きませんか株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。採用情報プロジェクトマネージャー(リモート)ソフトウェアエンジニア(リモート)デザイナー(リモート)Subscriptionメールアドレスを記入して購読すれば、更新をメールで受信できます。ThemePacific。