暗号化とは?暗号化の種類やメリットなど初心者にわかりやすく説明
暗号化とは?暗号化の作成方法や暗号化の種類、暗号化の用語「SH-256」などの説明はできますか?2020年の最新パスワード暗号化について初心者でもわかりやすいようにまとめました。
ここで少しだけ自己紹介させてください。
おすすめライフログ LIFELOG(@osusume_life)の
かずのりです。
フリーランス15年以上の現役エンジニアです。
現在、コロナの影響で自宅で作業中の
ノマドワーカーです。
目次
はじめに
私はフリーランスの現役プログラマーです。
経歴は約15年以上のベテランエンジニアです。
ある日、現場で仕事をしていたときにこんなことを
お客さんから言われました。
「新しい環境でテストしたいのでパスワード暗号化しておいてください」
私はどの現場でもやっている「公開鍵」の作成だと思っていましたが、指定されたものは全然違いました。
「暗号化のやり方はエクセルにまとめてあります」
暗号化のやり方が書いてあるエクセルを見ると絶句でした。
私はPHP言語をメインとしたエンジニアとして活動していますが資料に書かれたやり方の言語は明らかに「java言語」
そして詳しくは覚えていないんですが、下記のキーワードが書かれていました。
- nonce
- SH-256
- DES方式
これらについて私は全くといって良いほど無知でした。
理由は現在の主流のやり方とは全く違うからです。
少し古いやり方なのかもしれません。
どちらにしろ全く説明できない状態ですのでこのブログを書きながら一緒に説明していきます。
パスワードの暗号化とは
パスワードは何も加工しない状態で使用していると第三者に盗まれる可能性が高いので他人から分からないようにするために「暗号化」が誕生しました。
例えば「Hello」というパスワードを暗号化にすると「123abc45」。
「123abc45」だけを見てもパスワードが「Hello」ということは全くわかりません。
このようにパスワードの文字列に何らかの技術使い第三者からわからなくするための技術が「暗号化」です。
暗号化にする必要性とは
私は面倒くさがりなのでパスワードなんて盗まても重要な情報なんて見られても大丈夫と思っていました。
ですが、それが大間違い!
パスワードを盗まれるということは100%悪用されます。
どんなことに悪用されるか可能性をまとめてみました
- 他サイトもログインできてしまう(パスワードの使いまわし)
- クレジットカードを使って高額商品が勝手に購入される(個人情報の漏洩)
- あなたのメールを使って勝手に他人へ大量のメールを送信される(迷惑メール)
- フィスブック、ツイッターなどのSNSの乗っ取り
- 銀行から預金が別のところへ振り込まれる
などなど考えられるだけでもゾッとします。
日頃からパスワードの取り扱いについて検討しましょう
パスワード暗号化の種類について
パスワード暗号化については調べるといろいろとでてきます。
私がよく現場で使うのが「公開鍵」をつかう「公開鍵暗号方式」
それ以外にも暗号化したパスワードを復元できる方式や逆に復元できない方式があります。
暗号化と言ってもシステムのOSによっても異なります。
まずは暗号化の種類をまとめてみました。
パスワード暗号化方式の種類
大きく分けると下記の3つに分類できます。
暗号化には「復元」できるものと「復元」しないものに別れます
- ハッシュ化
- パスワードなど文字をハッシュアルゴリズムで「不可逆変換」にする方式
- MD5、SH2などの種類がある
- SH2はこれら(SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256)の総称
- 公開鍵暗号方式
- 「公開鍵」「秘密鍵」を作成しパスワードなどの暗号文を「秘密鍵」を使って復元して使う方式
- パスワードを使う送信者に受信者が「公開鍵」を渡し、受信側は送信された「公開鍵」を「秘密鍵」で復元する
- RSA暗号、楕円曲線暗号などの種類がある
- 共通鍵暗号方式
- 「秘密鍵」を作成し暗号化されたパスワードを「秘密鍵」で復元して使う方式
- 「秘密鍵」は送信者、受信者の双方が同じ鍵を持つため共通鍵と言われる
- DSE、FEAL、IDEA、AESなどの種類がある
同じ方式でもいろいろな種類があるのは「暗号化アルゴリズム」が異なるからです。
PHP言語を使って暗号化プログラムを書いてみる
PHPエンジニアですがPHP言語の関数を使ってどの種類の暗号化ができるか確認してみます。
文字のハッシュ化
<?php
// m5
echo hash('md5','hello');
?>
$ php hash.php
5d41402abc4b2a76b9719d911017c592
<?php
// sha256
echo hash('sha256','hello');
?>
$ php hash.php
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
PHP言語の場合、「暗号化アルゴリズム」はたくさんありましたが、標準で使える暗号化の関数はほとんど「ハッシュ化」でした 。
すなわち復元がができない一方的な暗号化です。
PHP暗号化の関数で気づいたこと
上記でPHPで暗号化するときによく出てきた言葉「ソルト/salt」
こちらについて調べてみました。
ソルトとは暗号化する文字列の前後にランダムな文字を結合させたデータこと
文字をハッシュ化した場合、上記のPHPを何回も実行しても同じ結果しか返却されませんので悪いハッカーにバレてしいます。
少しでもわかりにくくするためにソルトを使って生のパスワードがわかりづらいようにします。
ソルトを使ったパスワードの生成方法
<?php
// crypt
echo crypt('hello','12345');
?>
$ php hash.php
12vi5XM5JeKI$
最後に気になったキーワード「ノンス/nonce」について調べてみた
ノンス(英語表記:nonce)とは「number used once」の略で
一回だけしか使わない番号でワンタイムトークンとも呼ばれます。
最近では、ネットで銀行の振り込みの際にワンタイムトークンを使っています。
使われる理由としては、ワンタイムトークンは一回しか使いません。そのため、何回も同じワンタイムトークンが送られると受信側は悪いハッカーと思いすぐにロックをします。
また、送られて来たワンタイムトークンは過去のデータと参照し同じ番号がないかチェックします。
もし、同じ番号が送られて来た場合、こちらもロック対象となりそのサービスは使用できなくなります。
セキュリティと同様にユーザーを監視するためにもこのワンタイムトークンが採用されているそうです。
銀行などセキュリティが高いところで使われる理由がわかりました。
まとめ
今回、パスワードの話題から暗号化について調べました。
私も言葉だけ知っていましたが実際どんな内容なのかかなり勉強になりました。
今回紹介した暗号化はほんの一部です。
暗号化アルゴリズムが膨大にありシステムのOSによっても
得意不得意があるそうです。
プログラマーじゃなくても暗号化について一度勉強することをおすすめします。
いつかこのつづきも書いてみたいとおもいますので
今後ともヨロシクお願いします。
今日はここまで!