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

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

ただいまの
回答率

88.03%

SSLを使用せずformのデータを暗号化しPOSTでPHPに渡したい。

受付中

回答 6

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 12K+
退会済みユーザー

退会済みユーザー

PHP,Javascriptを勉強中のものです。

現在PHPでログイン機能のあるwebページを試しに作っていますが、クライアントからサーバーに送信されるデータの暗号化をしたいと思っております。SSLを使えばいいのでしょうが、証明書の調達などが必要なためなかなか手が出せません。(自作もできるようですが。)

そこで、簡易的にjavascript等でこれができないかと思い質問させていただきました。
しかしjavascriptにはじめて触れるので何をどうしたらいいのか分かりません。

希望としては
<form method="POST" action="./login.php">
メールアドレス
<input type="text" name="mailaddress"><br>
パスワード(10字以下)
<input type="password" name="password" maxlength="10"><br>

<input type="submit" value="テスト" style="width: 100px; height: 50px">
</form>
これをsha256等で暗号化した状態でPHP側に渡したいと考えております。

---------------追記---------------
SSLや暗号化って言ってるのにsha256などと書いてあり紛らわしく申し訳ありません。
復号化はできなくても大丈夫です。sha256等なら同じ文字列はハッシュ値も同じになるのでそれをパスワードとしてDBに記録すれば大丈夫だと思っていました。
(もちろん自分が用意したページ以外から生で正しいパスワード送っても弾かれますが、これから作ろうと思っているサイトではそういうことをあんまりさせたくないのでいいかななどと思っております。)
それと、SSLのほうも証明書自作してどんなものか試してみます。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

0

はじめまして。

下記ページにjavascriptでの暗号化・復号化について書かれています。
http://qiita.com/tnakagawa/items/bba972e71cdc4f0f29f5

これを使い、文字が入力されたときまたはsubmitがクリックされたときに暗号化処理を行ってPOSTで値を飛ばし、受け取り側で復号化すればいいのではないかと思います。
ただし、javascriptはPOSTされた値を受け取ることができません。(ライブラリなどを使えばできるかも?)
そのため、PHPで受け取った値をjavascritpに渡して処理をさせる必要があるので面倒かもしれません。
上記ページでの復号化処理が理解できるのであればPHPで復号化処理を作る方が楽かと思います。

試しに作っているWEBページとの事なので問題ないと思いますが、これを外部公開するサイトで使用しても暗号化の意味はありません。
SSLと違い通信そのものを暗号化するわけではないのでPOSTした値が抜き取られ復号化されてしまいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

アプリケーションレイヤーでこういった暗号化をするのはアンチパターンが気がしないでもないので、
もう一度手法を検討したほうがいいとは思いますがとりあえずこんな感じですかね。

※JQuery使ってること前提で
$(function(){
    var encrypt = function(val) {
        // なんらかの可逆変換可能な暗号化をする
        return val + "hoge";
    };
    
    $('form').on('submit', function(){
        var $form = $(this).clone().hide();
        
        // formの全要素の値を書き換え
        $.each($form.serializeArray(), function(k, v){
            $form.find('[name="' + v.name + '"]').val(encrypt(v.value));
        });
        
        $('body').append($form);
        $form.submit();
        
        return false;
    });
});

暗号化部分は適当です。
PHP側で復号化する必要がありますがsha256のハッシュ化するアルゴリズムは
不可逆なので元に戻せません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

SHA256は暗号化ではないです。

公開鍵暗号をJavaScriptで実装すると良いかも知れません。
すなわち...

  1.  AJAXを使ってサーバサイドから公開鍵Sを受信する。
  2.  クライアントサイドで公開鍵Cと秘密鍵Cを生成する。
  3.  クライアントサイドで秘密鍵Cと公開鍵Sを使って、送信したいデータを暗号化する。
  4.  暗号化したデータと公開鍵Cをサーバに送信する。
  5.  サーバサイドで、公開鍵Sのペアである秘密鍵Sと公開鍵Cで、暗号化したデータを複合化する。

...ということです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/21 11:22

    率直に言えば、このような実装を書くより、SSL証明書を買う方が早いと思います。

    キャンセル

0

余談ですが、
SSL証明書も最近は3000円/年程度で買えるので(1ヵ月換算で250円)、よほどの苦学生さんとかでなければ、それほど経済的な負担にはならないと思いますよ。自己証明書(いわゆるオレオレ証明書)でもいいんですが、ブラウザの警告が鬱陶しいですしねw
https://www.google.co.jp/search?q=rapidssl

今年あたり無料化するって話しもあったりします。
http://www.itmedia.co.jp/enterprise/articles/1411/20/news049.html

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/21 19:07

    回答有難うございます。
    証明書、思ってたよりは安いですね。ただ実は当方、よほどの苦学生だったりしますw(学校の規則によりバイトすらできない。)
    自己証明書でのテストは成功し、JSのコードはうまくいっておらず「やっぱりSSLのほうがいいじゃん」という状態です。
    これから結局SSLを使おうと思います。とりあえず今は自己証明書でやっていき、無料化を気長に待ちたいと思います。

    キャンセル

  • 2015/03/21 20:01

    余談ついでですが。

    > よほどの苦学生だったりしますw
    高校生さんとかですか?
    学習用途なんであれば、例えば情報処理部でも作って(もしくは入って)学校から予算を引っ張りだせば結構リッチな環境で開発できますよ。余ったPCもらってきてサーバ代わりにしたりね。
    あとは学校の規程も、原則禁止ではあるが「家庭の事情」である程度柔軟に対応してくれることがあったりしますよ。まぁ最近はネットでお小遣い稼ぎもできるので、特に技術がなくても500円/月くらいなら簡単ですよ。まぁ参考程度に。

    キャンセル

0

英語サイトですが無料のSSL証明書もあるので、
https://www.startssl.com/?app=1
http://qiita.com/k-shogo/items/870b6d3939dd08da2de4
取得してみるのもいいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

学習のために自分で利用するだけなんですよね?「自己証明書」っていうのをUNIX上で作成すればSSL証明書はタダで使えますよ?ブラウザがセキュリティ絡みの警告を出してきますが、設定から「ルート証明書のインストール」という操作を手動で行って作成した自己証明書をインポートすればそれも出なくなります。
自己証明書作成についての記事

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る