暗号化って一体どういうことなのか?最も基本的な暗号の仕組みを解説

インターネットは便利ですが、個人情報をネット上に預けることもあるし便利な半面、危険性やリスクもあります。

個人情報をネット上に送信する際には情報を安全に送る必要があるのですが、そこで大事になってくるのが暗号化です。

ということで、今日は暗号化の基礎をお話したいと思います。

暗号化が何故大事なのか?

暗号化が必要な場合は色々あります。簡単な例をいくつか挙げてみます。

通信自体を暗号化する必要がある場合

インターネット使ってると問い合わせフォームで個人情報送信したりユーザーログイン画面でメールアドレスとパスワード送信したりしますよね。

この時に自分の端末と閲覧してるサイトとの間に悪意のある人間や、悪意のある人間が設定した端末がなければ全く問題ないのですが、公共WiFi使ってたり、怪しいネットワークを使ってたとしたら、送信した個人情報を覗き見されている可能性があったりします。

具体的に図で説明します。

図にするとインターネットの接続はこんな感じです。

①自分の端末から②WiFiに接続する場合、WiFiの管理者が自分なら問題ないですがそうじゃない場合、通信ログで何を送信したかバレてしまう可能性もあるし、さらに管理者が悪意のある人だったら送信した個人情報を悪用する可能性もあります。

これが通信を暗号化しないといけない理由です。

通信の暗号化はSSLなどと呼ばれており、アドレスがhttpsではじまURLのことです。

SSL非対応のサイトは通信を盗まれる可能性があるので、個人情報を送る時は気をつけたほうがいいです。大事な情報を知らないネットワークから送る時はSSLであることことを確認しましょう。

こんな風にブラウザのアドレスバーが緑色になっていればSSL対応で安全です。

ちなみに当サイトもSSL対応しましたが、サイトを作る人が導入したり設定したりする必要があるわけで、ちょっと手間がかかったりお金がかかったりします。

余談ですがGoogleもSSL対応をSEOの評価要素に入れたみたいですので、SEO的にもSSL対応しておいた方が多少有利ということになります。

パスワードは暗号化して保存しないといけない

通信が暗号化できたとしたらサーバーまではメールアドレスやパスワードを安心して送れるようになったわけですが、保存するサーバー側も開発者がパスワードを暗号化してデーベースに保存しておかないとまずいです。

ユーザーログインに必要なメールアドレスとパスワードが漏れたら他人にログインされてしまう可能性が出てきますよね。

ユーザーはパスワードの管理を厳重にしておくべきなのと同時に、ウェブサイトを作ってる人も実はパスワードなどの重要な情報はできるだけ預かりたくないと思っています。

もしサーバーをクラックされたらみんなのパスワード流出したりして責任問われちゃいますしね。。

なので、サーバー管理者はユーザーから送られてきたパスワードを必ず暗号化して保存します。

そもそもパスワードはどこに保存されているのか?

そもそもウェブサイトに使うメールアドレスとパスワードはどこに保存されているのでしょうか?

大抵の場合は、サーバー内のデータベースに保存されてます。

データベースというのはExcelを少しシンプルにしたようなもので、上から順番にレコードが保存されていくアプリみたいなもんです。

↓ざっくり書くとこんな感じ

名前 メールアドレス パスワード
田中さん tanaka@example.com tanakapass
山本さん yamamoto@example.com yamamotopass
鈴木さん suzuki@example.com suzukipass
佐藤さん satoh@example.com satohpass

 

 

もしメールアドレスがtanaka@example.com パスワードがtanakapassで送信された場合、1行目の田中さんがヒットするにで、田中さんでログインといった仕組みです。

パスワードを暗号化してみる

さっきの表だとパスワードを暗号化せず保存した場合ですが、暗号化するとこんな感じになります。

名前 メールアドレス パスワード
田中さん tanaka@example.com be13ce956417a24515ae27c9cc1b327b
山本さん yamamoto@example.com 57307a5a5d3c215af845c7ebe527e04a
鈴木さん suzuki@example.com e806b8ecb310fa55aa2f1664450c221f
佐藤さん satoh@example.com 4c90b9904e5ce55fd3974375726b705a

 

元々の tanakapass が be13ce956417a24515ae27c9cc1b327b になりましたね。

暗号化された文字列からは元のパスワードに戻せないようになっています。

これが非可逆暗号化ってやつです。

これでユーザーとしてもウェブサイトの管理者にパスワードを知られることはないし安心だし、ウェブサイトの管理者側も万が一個人情報を流出させてしまったとしても、パスワードが暗号化されているので安心(?)ということです。

ちなみに今回の暗号化アルゴリズムはMD5といいます。
下のフォームで試せるようにしてみました。



暗号化の実験:

結果:

パスワードを平文保存しているサイトは結構ある

そんなわけで、ウェブサービスを作るならパスワードは絶対に平文保存しないというのが基本となるわけですが、実は大手のサイトなどでもパスワードを平文保存してるサイトって結構あるんですよね。

例えばJ○東海とか○Rバスとか。。。

パスワードを平文保存しているかどうか、どうやって判断するかと言うと、パスワードリマインダーの機能があるかどうかで判断できます。

パスワードリマインダーっていうのはパスワードを忘れた時に、パスワード忘れたボタンを押すと、貴方のパスワードは○○○ですってメールを送ってくるサイトです。

暗号化してたら、その文字列は非可逆なので、元の文字列は絶対にわからないからです。

ちなみに、はてなブログでこういう記事があるので参考にして下さい。

平文メールにパスワードを書いて送ってくる糞企業一覧

暗号化の仕組みってそもそもどうなってるの?

さて、暗号化の重要性は先程説明したとおりですが、暗号化ってどういう仕組になっているのか基本的な考え方を書いておきます。

暗号の歴史って結構古く、紀元前のエジプトから暗号の仕組みはあるみたいです。

当時の暗号化っていうのはスキュレーター暗号ってやつで、こんな感じに布やら紙と、棒をセットにして巻きつけると文章ができるってやつです。

時代が進んで、紀元前1世紀にローマで発明された暗号技術がシーザー暗号です。

これはアルファベットなどの規則的な文字配列を、ある規則のとおりにずらすって考え方

下記の例は、全ての文字を3つ手前にずらす感じですね。

 

DならAでEならBですね。

このずらす基準のことを鍵と言ったりして、お互いに鍵を知っていれば一見ランダムな文字列も、文書に変換することができるわけです。

シーザー暗号あたりからが現代で使われる暗号化の基礎な感じになってきます。←違ってたらすいません。

時代がさらに進んで、戦争でコンピューターが使われて暗号技術はもっと複雑になりますが、そこまで詳しくない・・技術的なことや歴史的な話が複雑になるので割愛です^^;

また機会があれば追記していきます。

最近の暗号化技術

シーザー暗号は共通鍵を利用するシンプルな暗号化の方法です。

「3つずらす」と決めたらお互いが「3」という数字を覚えておくことになります。

シンプルなんですが、致命的な欠点がありましてこの「共通鍵をそもそも最初に相手に教える方法がない」んです。

アナログに直接伝えるなら良いとしても、インターネット上の場合はそういうわけにもいかないし、教える時、暗号化せずに教えてしまったらそれ自体が流出するし意味がないんですよね。。

共通鍵の問題を解決したのがRSA暗号

RAS暗号は公開鍵と秘密鍵を持ちます。

片方の鍵Aを使って暗号化した暗号文は、その鍵では復号することができず、もう片方の鍵Bでしか復号できないという仕組みです。 同じく、逆にもう一方の鍵Bで暗号化した文字列は、もう一方の鍵Aでしか復号できないという考え方なのです。詳しいことはwikipediaを見てください^^;

https://ja.wikipedia.org/wiki/RSA暗号

この公開鍵は公開しておいても秘密鍵がないと解読することができないので、渡してしまってOKなんですよね。

ところで、このRSAという暗号方法は素因数分解の仕組みを使ってるらしいです。

例で言うとこんな感じです。

  • 11と3を使って33という公開鍵を作成します。この33は公開鍵なので見せてもOKです。
  • やりとりするときは33という数字で暗号化します。
  • 33という鍵がバレたとしても、33から11と3は割り出せないので暗号化成立というわけです。

実際小さい数字だと11と3は割り出せてしまいますが、これが巨大な数字だった場合、

巨大な二つの素数を掛け合わせた数を素因数分解できる効率的なアルゴリズムがないので安心ということになっています。

8635844967113809みたいなデカい数字だと、何と何の掛け算でできた数字かわからないんですよね。

素因数分解で妄想してみる

巨大な二つの素数を掛け合わせた数を素因数分解できる効率的な方法は見つかってません。

世界中の偉い人が頑張って研究しててもまだ見つかってないのです。

もし、あなたがもの凄い天才で、巨大な二つの素数を掛け合わせた数を素因数分解できる効率的な方法を思いついたとします。

そして、その方法を論文で発表しようとしたとします。

でも、その方法が公になったら今ある暗号化の技術は無効になるので色んな人が困るし、社会の仕組みを壊すことになるわけです。

なので、物凄く効率的な素因数分解のアルゴリズムを見つけたとしたら、こういうシナリオが待っているのじゃないかと思ったりします(´・ω・`)

  • 論文発表前にNSA的な組織に拉致られて殺される
  • 論文発表前にNASA的な組織に拉致られて宇宙開発とかやらされる
  • 論文発表前にフリーメイソン的な組織に拉致られて秘密の仕事をさせられる

 

ナッシュ均衡で有名な、リーマン予想の研究をしてたジョン・ナッシュなんかは精神病になったりしましたしね(´・ω・`)

つい陰謀の妄想をしてしまいます。

暗号化のまとめ

暗号化やセキュリティーってトラブルになるまで重要性に気が付かないですが、トラブルになってからでは遅いので早めに対策しておくべきです。

未だに暗号化されてないFTPを使う会社もあったりするので気をつけましょう。

The following two tabs change content below.
西尾学
会社の代表やってます。遊ぶように仕事やってます。