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

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

ただいまの
回答率

90.53%

  • PHP

    23553questions

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

  • JavaScript

    19912questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • C#

    8832questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

URLのパラメーターに復号化可能な方法で暗号化したい(ソルト付き)

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,669
退会済みユーザー

退会済みユーザー

お世話になります。
URLのパラメーターに日本語・英数の文字列を復号化可能な方法で暗号化して埋め込みたいと考えています。
例えば、

http://www.hoge.com/page.php?param=今日2月4日は晴れ

という「今日2月4日は晴れ」パラメーターを暗号化したいのです。

「今日2月4日は晴れ」を暗号化→URLエンコード

となると思います。

そのままBase64などだと他人にバレてしまうので、他人にはわからないソルトのような文字列を付加して、暗号化したいのですが何か良い方法はあるでしょうか?

C#, php, javascriptで暗号化・復号化が可能な環境で検討しています。

どうぞよろしくお願い致します。


追記
パスワードなどをURLパラメーターに使うわけではなく、どちらかというと管理のために使いたいパラメーターです。
ですのでセキュリティ的にはゆるくて問題ないのですが、それでも簡単に復号化できてしまうのも嫌なので、ソルトのような復号するための文字列があればいいという感じです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 6

+5

具体的な暗号化の前に確認が必要な部分ですが、「ブラウザ内の」JavaScriptで暗号化・復号化するのでしたら、セキュリティ的にはほぼ無意味です。

というのも、JavaScriptの処理はユーザーの手元で行われますので、暗号化のアルゴリズムも鍵もユーザーが触れる、ということになるからです。

「ユーザーから直接見えなければそれでいい」という程度でしたら、それこそBase64だけでも用を果たしそうです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/04 15:09

    ありがとうございます!
    すみません・・・言い忘れたのですがユーザーにバレてもいいレベルのパラメーターなのですが、簡単に復号化はできないようにしたいのです。
    パスワードとかではないのでセキュリティ的にバレてもいい内容という感じです。

    質問に書き忘れたので追記しておきます。

    キャンセル

checkベストアンサー

+2

こんにちは。

C#, php, javascriptで暗号化・復号化が可能な環境

というのが、クライアント側含め、どの環境でも復号可能でなければならないということなら、この回答は無視してください。


「URLに載せるパラメータ」を暗号化ということは、「サーバに送信するパラメータ」を暗号化したいという意味だと理解しました。
ということは、クライアント側では暗号化されたパラメータの作成だけ行えればよく、サーバ側でそれを復号できればいいということにはなりませんか。
このパターンであれば、RSAなどの公開鍵暗号がそのまま使えると思います。
サーバ側であらかじめ鍵を作っておき、クライアント側に公開鍵だけ提供すればいいでしょう。
やってることはHTTPSそのままなんですが。もともとHTTPSを使ってるなら、アドレスバーのパラメータを暗号文字列で表示できる以外の意味はありません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/06 14:32

    ありがとうございます!

    >クライアント側含め、どの環境でも復号可能でなければならないということなら

    いえ、どの環境でも復号可能ではなく復号するための鍵は自分だけが持っていればいいかんじです。
    ですので共通鍵でもよいですし、公開鍵でも構わないのでRSAは良いかもしれませんね。

    キャンセル

  • 2017/02/06 14:46

    その要件なら、素直に真面目な暗号化を施すなら公開鍵が良いでしょう。

    > ですので共通鍵でもよいですし、
    一応念のため。共通鍵を(クライアントの手に届くように)配布するやり方だと、「通信経路上の他人」でも復号可能となる危険性があることは認識しておいて下さいね。公開鍵ならそうはなりません。

    キャンセル

  • 2017/02/08 01:39

    はい、ありがとうございます。

    キャンセル

+2

「他人」とはどこにいる、どんな人なのかを考えてみましょう。
通信経路の途中にいるのであればhttpsを利用するかtamotoさんの回答で解決します。

パラメータを生成するクライアント側にいるのでしたら、他の方が指摘しているとおり不可能です。
この場合にせいぜいできることは暗号化ではなく難読化です。

  • 普通の人(パラメータを見ることができるだけの人)
    難読化されたパラメータから元パラメータを解読しにくい手段を選びます。
    BASE64文字列を反転する、共通鍵で暗号化するなどなんでもよいです。
     
  • 少し詳しい人(クライアントコードを見れる人)
    「パラメータを難読化するクライアント側コード(javascript)」を難読化します。
    その強度は難読化ツールによって異なると思いますが、原理的に解読可能なので気休め程度にしかなりません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/06 08:54

    こんにちは。can110さんのご回答に賛成です。
    質問者様へ、「ソルト」の意味を誤解されていると思われます。
    「他人にはわからないソルトのような文字列を付加して」は、たぶん「ハッシュ」することを仰っているのでしょうか...ソルトは「復号するための文字列」ではなく、「レインボーテーブル」と呼ばれるハッシュの「逆引き表」対策のために組み込まれるものです。
    http://www.atmarkit.co.jp/ait/articles/1110/06/news154.html

    キャンセル

  • 2017/02/06 14:39

    ありがとうございます!

    >「他人」とはどこにいる、どんな人なのかを考えてみましょう。

    そうですね・・・通信経路の途中ではなく、サイトを見れる人全てです。
    サイトを開けばURLが表示・取得できますので、それを見ることができる環境にある人全てが対象となります。
    曖昧で申し訳ございません・・・。

    それと難読化、たしかにそちらのほうが正しいかもしれません。
    正直、「パラメーターが平文にできたからといってそれが攻撃材料になるか?」といえば、なりません。
    そのURLパラメーターを持つサーバー内にその情報があるわけでもないので、そのパラメーターを使ってサーバーを攻撃しようとしても何も起こらないです。

    質問にも書いたように「今日2月4日は晴れ」というレベルの内容なので、どちらかというと難読化のほうが質問の意図としてはただしいかもしれませんね。

    それとhskさん、すみませんソルトの意味を誤解しておりました。
    ご説明いただきましてありがとうございます。

    キャンセル

+1

(…) セキュリティ的にはゆるくて問題ないのですが、それでも簡単に復号化できてしまうのも嫌 (…)

これでは何をしたらいいのかよくわからないです。「簡単に復号化」できないのに「セキュリティ的にはゆる」いというのはほぼ矛盾する要求です。

とにかく、「暗号」という以上は容易に復号できては困ります。アルゴリズムにはRC4を使ってはどうでしょうか。比較的短いコードでかなり強度の高い対称鍵暗号を実装できます。暗号化のたびにランダムな初期化ベクタ (IV) を用いるという点も要求に合っていると思います。

RC4のC言語による実装であるCipherSaberの解説が、「CipherSaber / サイファセイバー」(結城浩) にあります。ネット上でほかの言語での実装も見つかると思いますし、ご自分で実装してもいいでしょう。

(追記)

なお、ソルトやIVは鍵ではありません。暗号文から平文を推測する攻撃を (より) 困難にするためのものです。一方、鍵が分かれば復号はできますから、鍵を知られた場合にはソルトやIVは何の対策にもなりません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/04 20:10

    ありがとうございます!
    URLパラメーターはいろいろな用途に使えるので、単にそのように使いたいというだけです。
    パスワードでもないですし最悪漏れてもいいような情報です。
    すみません・・・本題からそれますので用途についての回答は控えたいと思うのですが・・・。

    RC4についてのご回答ありがとうございます。
    こちらについていくつか見てみました。
    共通鍵を使う点なのですね。
    まだ詳しく調べきっていませんが非常に用途にあっているような気がします!

    とても助かりました!

    キャンセル

+1

単純に、「圧縮してからBASE64」というのはどうでしょうか。
簡易的な暗号化、というかパッと見でばれない程度であればいいのでしたら、選択肢としてアリかもしれません。

C#ならDeflateStream
https://msdn.microsoft.com/ja-jp/library/system.io.compression.deflatestream(v=vs.110).aspx

PHPならgzdeflate
http://php.net/manual/ja/function.gzdeflate.php

JavaScriptだと、dankogai謹製ライブラリ
https://github.com/dankogai/js-deflate

あたりでまず圧縮して、得られたバイナリをBASE64で。
パラメーター部の長さ短縮、という副次効果も期待できます。
(元の文字列の長さ次第ではかえって膨らみますが…)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/08 01:37

    ありがとうございます。
    そのような方法でもいいですね!
    参考になります!

    キャンセル

+1

解読可能でいいなら暗号化しなくて良いですし、base64エンコードでも何ら問題はないと思います。
それで納得できないのなら、何の為に暗号化するのか、を具体化すべきだと思います。

Re: x25m さん

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/08 01:38

    その件に関してはお手数ですが過去の回答をご覧頂ければと思います。

    キャンセル

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

  • PHP

    23553questions

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

  • JavaScript

    19912questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • C#

    8832questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。