phpのプログラムで公開鍵方式の暗号化を実装したいと考えています。


具体的には

格納時:
データを取得⇒公開鍵で暗号化⇒データベースに格納

複合時:
データベースからデータ取得⇒秘密鍵で復号化⇒変数に格納

という流れになります。

通信は全てSSLで行われます。

いい方法をお知りの方が居られましたらご回答宜しくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2006/04/24 17:37:11
  • 終了:2006/05/01 17:40:03

回答(8件)

id:tadashi0805 No.1

tadashi0805回答回数287ベストアンサー獲得回数292006/04/24 18:15:25

ポイント17pt

データベースは、何をお使いでしょうか?

例えばMySQLなら、暗号化関数を持っていて、公開鍵を使ってAES_ENCRYPT()で暗号化した文字列を格納し、逆に取り出した文字列を公開鍵を使ってAES_DECRYPT()で復号化するというSQLレベルで行えます。

これですと、あるカラムを暗号化、復号化で出し入れする際、これらの関数をかますだけで、phpのプログラム側ではあまり大きな修正を行う必要がありません。

id:mgaki

回答ありがとうございます。

しかし、この方法ですと、公開鍵がわかれば、phpの改竄によってデータを取り出すことが可能になってしまいます。

データベースはmysqlを利用しています。

格納時の暗号鍵と、復号時の暗号鍵が異なる

方法を探しているので、もしご存知であれば

再度ご返答お願い致します。

2006/04/24 18:54:31
id:hengsu No.2

hengsu回答回数185ベストアンサー獲得回数102006/04/24 19:32:06

ポイント17pt

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2058...

この流れの話でしょうか。

id:mgaki

cryptは非可逆ですのでダメです。

今回は

phpによる、「可逆」で暗号化と複合化のコードが「異なる」

仕組みの実現をお願いします。

2006/04/24 19:52:21
id:ma-kanoh No.3

ma-kanoh回答回数155ベストアンサー獲得回数42006/04/24 20:58:06

ポイント16pt

http://dummy

その要件だと、「共通鍵」で十分だと思いますが。

「共通鍵」そのものを盗まれなければ、PHPのソースをいくら改ざんしようが、データは取得できません。

「公開鍵が分かれば」とありますが、そもそも、秘匿しようとしている鍵がばれたら、暗号化は、どのレベルでも無意味です。

ちなみに、公開鍵暗号方式は、「公開鍵」で暗号化して

「秘密鍵」で復号します。だから、その場合は、単に公開鍵で

暗号すれば、公開鍵は(公開する使い方が出来るので)そのままでも

問題ありません。

PHPだったら、普通にOpenSSL系を使えば、例えばPKCS#7レベルでも

問題はないと思いますが。

ただし、その場合も「秘密鍵」を盗まれれば終わりです。

そういう意味では、どのような暗号方式も「なんにもせずに安全には」使えないと思います。

なんか暗号化を、「なんの設計もしないまま見えないように変えてくれる」ものだと思ってるようですが。暗号化をするということは、それだけでリスクです。

上記の場合は、「秘密鍵」を秘匿するのも「共通鍵」を秘匿するのも同じだと思います。

通常、公開鍵暗号方式は、相手方が信用できないシステムに

用いるのが一般的です。

上記のように同じDBで公開鍵暗号方式を使用してもいいことはないと思いますが。

id:mgaki

回答ありがとうございます。

暗号化はインターネット上で通信される鍵で行われますが、複合化はローカルからのみ行われますので、このようなシステムを考えるに至りました。

OPENSSL関数の方も現在トライしています。

他にも良い方法があればご教授頂ければ幸いです。

2006/04/25 08:50:44
id:l-lol-l No.4

l-lol-l回答回数310ベストアンサー獲得回数102006/04/24 21:44:49

ポイント16pt

えーとRSAでの暗号をお望みだと思いますが、ものすごーーーーく遅いですよ。

現実的な方法は、鍵をつくって、AESで暗号化して、その鍵だけを公開鍵で暗号化する。

でしょうか。

方法的には、多分opensslのRSAの関数をそのまま使うことになると思います。

id:nakahara88 No.5

nakahara88回答回数3ベストアンサー獲得回数02006/04/25 12:10:28

ポイント16pt

system関数でGPG(GnuPG) を呼ぶのではだめですか?

id:mgaki

なるほど。これですとファイルの暗号化になりますね。単に変数を暗号化したかったのですが…

単にphpで利用できる、暗号化と複合化が異なる文字列の暗号化というレベルでいいですので、他にも方法があればお教えいただけるとありがたいです。

2006/04/25 16:22:35
id:nakahara88 No.6

nakahara88回答回数3ベストアンサー獲得回数02006/04/25 16:43:35

ポイント16pt

GPGは、標準入出力も扱えると思いますが。

id:nakahara88 No.7

nakahara88回答回数3ベストアンサー獲得回数02006/04/25 16:58:38

ポイント16pt

phpの以下の関数は?

openssl_private_decrypt -- 秘密鍵でデータを復号化する

openssl_private_encrypt -- 秘密鍵でデータを暗号化する

openssl_public_decrypt -- 公開鍵でデータを復号化する

openssl_public_encrypt -- 公開鍵でデータを暗号化する

id:ma-kanoh No.8

ma-kanoh回答回数155ベストアンサー獲得回数42006/04/25 22:16:18

ポイント16pt

http://dummy

>暗号化はインターネット上で通信される鍵で行われますが、複合化はローカルからのみ

あっとえっと、そもそも、その「インターネット上で通信される鍵」は、暗号化しません。SSLはデータの暗号化はしませんよ。通信路は暗号化しますが。SSLから取り出したあとは、SSLはなんの関係もありません。

それはともかく、ワンタイムパスワード系でいいのかな。

セッションに鍵のような文字列を入れて、かつ<INPUT HIDDEN "INDEX"=1>して、1はだったら2にしてセッション鍵文字列とともに変数を暗号化する。

SESSIONID=abc(abc->secret=123にくくりつける。サーバで)

cookie=abc index=1がサーバにきたら、"123"でかつ1+1=2で変数を復号する。

別にパスワード暗号として使えば共通鍵だ。

PHPでパスワード暗号、、、できたっけな(苦笑)

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません