質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

6回答

3199閲覧

パスワードの暗号化後、複合にはどのような手段を用いる?

momolength

総合スコア62

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/08/19 08:57

編集2021/08/19 09:02

2点あります。

PHP(larabel)でファイルに対しパスワードを設定するため、パスワードを登録するWebサイトを作成しています。
MySqlにデータを保存する際、暗号化するのが一般的ですがそれは一体どこでどうやって複合しますか?

また、可逆である必要がある場合(暗号化をせずにdb保存)、保存の際に注意点がありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/08/19 10:52

> 可逆である必要がある場合 どのような事情があるのでしょうか?
YT0014

2021/08/21 08:28

暗号化したデータを元に戻す処理は、「復号」ですので、タイトルなどの修正をお願いします。
guest

回答6

0

既に皆さんが指摘されているように、パスワードはハッシュ値で保存することが一般的ですが、その理由をまず説明します。

  • パスワードが復号できると管理者による悪用が心配
  • 暗号鍵が攻撃者に知られないように保存する必要があるが、これが難しい
  • 暗号利用モードなど、暗号化の実装が意外に難しい

暗号鍵についてですが、そもそもパスワードを保護しなければならない理由は、ウェブサイトに仮に侵入された場合でもパスワードは保護したいからです。ところが、ウェブサイトに侵入した攻撃者はウェブアプリケーションが動作する権限と同じ権限を持ちます。なので、ファイルパーミッション等でパスワードを保護することができません。ウェブアプリケーションが読み出せる情報はすべて侵入した攻撃者のコードも読み出しができます。
このため、暗号鍵を安全に保管するシンプルな方法はありません。

次に、暗号利用モードについてですが、これの不備によりパスワードが解読されてしまった例があります。皆様御存知のAdobe社の事例です。下記のブログ記事を参考にしてください。

Adobeサイトから漏えいした暗号化パスワードはなぜ解読されたか | 徳丸浩の日記

結論としては、tanatさんの紹介された password_hash / password_verify を利用するのが簡明ですが、どうしても復号可能な形でパスワードを保存したいのであれば、上記に気をつけて実装する必要があります。こちらは現在のベストプラクティスではないので、お手本となるようなコードはほとんどないと思います。少なくとも私は見たことがありません。

投稿2021/08/19 12:08

ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momolength

2021/08/19 22:57

ご丁寧にありがとうございます。大変勉強になります。調べてもハッシュばかりだったので質問したんですが、ockeghemさんの回答を見てやっと理解出来ました。
guest

0

ベストアンサー

Webサイト上でパスワードを登録するとして、パスワードはdbへ保存する際、暗号化するのが一般的ですが

暗号化するのは一般的では無く、ハッシュ化するのが一般的です。
(細かい話と思われるかもしれませんが、ハッシュ化と暗号化は完全に別物なので区別をしないと前提が嚙み合わなくなってしまいます)

ハッシュ化には
password_hash()

ハッシュの一致確認には
password_verify()
を使用するのが一般的です。

また、可逆である必要がある場合(暗号化をせずにdb保存)、保存の際に注意点がありますか?

(可逆である=暗号化されているという事なので、用語上の噛み合わなさが出ていますが、)
まずはどういった情報をどの様な脅威から守る必要があるかの要件を定義するところから始める必要があります。
要件によってはコードの話では無く、DBMSやハードウェア自体の暗号化機能を使用する方が適正な場合も多くあるかと思いますよ。

投稿2021/08/19 09:11

tanat

総合スコア18716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momolength

2021/08/19 09:33

知識不足なためわかりづらくすいません。 暗号化にはハッシュ化が一般的であるとのことで、ハッシュ化は非可逆暗号化ですよね。可逆暗号化をしたい場合は、どういったやり方がありますか? ハッシュ化以外の暗号化で、パスワードを暗号化する時に用いるものはなんでしょうか。
tanat

2021/08/19 10:16 編集

まず、暗号化=可逆変換なので非可逆暗号化というのは単語として破綻していると考えます。(この辺は考えの相違があっても仕方ないところだとは思いますが、ハッシュ化や非可逆変換などの相応しい単語が存在している以上、厳密に使う必要があると考えています。) > パスワードを暗号化する時に用いるものはなんでしょうか。 可逆暗号化する場合はパスワードに限った話では無いので、 要件に応じて openssl_decrypt() https://www.php.net/manual/ja/function.openssl-decrypt.php や、`PHP 暗号化 ライブラリ` あたりで検索してみて要件を満たすと思われるライブラリを使うのが良いでしょう が、余程深刻で代替手段が存在しない場合以外はパスワードを暗号化した状態でDBに保存するのは避けなければいけません。
momolength

2021/08/19 10:47

仰る鳥だと思います。しかし存在する以上相対するものが存在すると考えるのが普通です。 つまりハッシュ化以外の暗号化を使えば問題なさそうですね。ご丁寧にありがとうございました。
guest

0

パスワードは復号可能な暗号化はしないので、「パスワードを復号可能な暗号化する場合は、どういう暗号化が一般的ですか?」という質問は無意味です。どれも一般的で無いので。

社内システムで、従業員のパスワードを監査部門が知りたいとかですかね?
そういうことであれば、簡単な暗号で良いのでは?つまりどんな方法でも良い。

投稿2021/08/19 11:00

otn

総合スコア85768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/08/19 11:01

監査目的なら違う方法を考えた方がいい気もしますが。
guest

0

パスワードは複合化しません
複合化出来るような変換はしません
phpならhmac、laravelならHashを使います
リンク見れば検証手順も分かると思うのでよく読みましょう

可逆で暗号化をせずに保存の意味が分かりませんが、平文で保存するという意味なら外部からも内部からも絶対に漏洩しないようにするしかありませんが、絶対は無理なので暗号化しましょう

投稿2021/08/19 09:11

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

復号化しません。もしくは復号化できない方式で暗号化します。

入力値を同じ方式で暗号化した値で比較、もしくは暗号化含めて言語やライブラリの持つ機能を使います。

可逆である必要がある場合

可逆なら復号化可能な方式で暗号化されてるのでは?
そもそも「暗号化せずに保存」という前提がセキュリティ観点で間違っているので応えようがないです。

投稿2021/08/19 09:08

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

入力に対して同じ暗号化手順で処理したものと、
DB上の暗号化してあるデータが合致すればよいので
複合しません

投稿2021/08/19 09:05

yambejp

総合スコア116443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momolength

2021/08/19 09:07

可逆である必要がある場合、どうするのが一般的ですか? また複合する手段が必要な場合はどうですか?
yambejp

2021/08/19 09:12

可逆なら非可逆でない方式の暗号化をしてください 結局データを抜かれた場合は暗号化・複合手順もばれてしまえば DBのなかの暗号化されたデータも平文とさほどかわらないでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問