お世話になります。
URLのパラメーターに日本語・英数の文字列を復号化可能な方法で暗号化して埋め込みたいと考えています。
例えば、
http://www.hoge.com/page.php?param=今日2月4日は晴れ
という「今日2月4日は晴れ」パラメーターを暗号化したいのです。
「今日2月4日は晴れ」を暗号化→URLエンコード
となると思います。
そのままBase64などだと他人にバレてしまうので、他人にはわからないソルトのような文字列を付加して、暗号化したいのですが何か良い方法はあるでしょうか?
C#, php, javascriptで暗号化・復号化が可能な環境で検討しています。
どうぞよろしくお願い致します。
追記
パスワードなどをURLパラメーターに使うわけではなく、どちらかというと管理のために使いたいパラメーターです。
ですのでセキュリティ的にはゆるくて問題ないのですが、それでも簡単に復号化できてしまうのも嫌なので、ソルトのような復号するための文字列があればいいという感じです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
具体的な暗号化の前に確認が必要な部分ですが、「ブラウザ内の」JavaScriptで暗号化・復号化するのでしたら、セキュリティ的にはほぼ無意味です。
というのも、JavaScriptの処理はユーザーの手元で行われますので、暗号化のアルゴリズムも鍵もユーザーが触れる、ということになるからです。
「ユーザーから直接見えなければそれでいい」という程度でしたら、それこそBase64だけでも用を果たしそうです。
投稿2017/02/04 05:42
総合スコア146544
0
「他人」とはどこにいる、どんな人なのかを考えてみましょう。
通信経路の途中にいるのであればhttpsを利用するかtamotoさんの回答で解決します。
パラメータを生成するクライアント側にいるのでしたら、他の方が指摘しているとおり不可能です。
この場合にせいぜいできることは暗号化ではなく難読化です。
- 普通の人(パラメータを見ることができるだけの人)
難読化されたパラメータから元パラメータを解読しにくい手段を選びます。
BASE64文字列を反転する、共通鍵で暗号化するなどなんでもよいです。
- 少し詳しい人(クライアントコードを見れる人)
「パラメータを難読化するクライアント側コード(javascript)」を難読化します。
その強度は難読化ツールによって異なると思いますが、原理的に解読可能なので気休め程度にしかなりません。
投稿2017/02/04 15:18
編集2017/02/04 15:46総合スコア38352
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/02/06 05:39

0
ベストアンサー
こんにちは。
C#, php, javascriptで暗号化・復号化が可能な環境
というのが、クライアント側含め、どの環境でも復号可能でなければならないということなら、この回答は無視してください。
「URLに載せるパラメータ」を暗号化ということは、「サーバに送信するパラメータ」を暗号化したいという意味だと理解しました。
ということは、クライアント側では暗号化されたパラメータの作成だけ行えればよく、サーバ側でそれを復号できればいいということにはなりませんか。
このパターンであれば、RSAなどの公開鍵暗号がそのまま使えると思います。
サーバ側であらかじめ鍵を作っておき、クライアント側に公開鍵だけ提供すればいいでしょう。
やってることはHTTPSそのままなんですが。もともとHTTPSを使ってるなら、アドレスバーのパラメータを暗号文字列で表示できる以外の意味はありません。
投稿2017/02/04 14:41
総合スコア4299
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/02/06 05:32

退会済みユーザー
2017/02/07 16:39

0
単純に、「圧縮してから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/06 00:12
編集2017/02/06 00:16総合スコア2019
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/02/07 16:37

0
(…) セキュリティ的にはゆるくて問題ないのですが、それでも簡単に復号化できてしまうのも嫌 (…)
これでは何をしたらいいのかよくわからないです。「簡単に復号化」できないのに「セキュリティ的にはゆる」いというのはほぼ矛盾する要求です。
とにかく、「暗号」という以上は容易に復号できては困ります。アルゴリズムにはRC4を使ってはどうでしょうか。比較的短いコードでかなり強度の高い対称鍵暗号を実装できます。暗号化のたびにランダムな初期化ベクタ (IV) を用いるという点も要求に合っていると思います。
RC4のC言語による実装であるCipherSaberの解説が、「CipherSaber / サイファセイバー」(結城浩) にあります。ネット上でほかの言語での実装も見つかると思いますし、ご自分で実装してもいいでしょう。
(追記)
なお、ソルトやIVは鍵ではありません。暗号文から平文を推測する攻撃を (より) 困難にするためのものです。一方、鍵が分かれば復号はできますから、鍵を知られた場合にはソルトやIVは何の対策にもなりません。
投稿2017/02/04 11:00
編集2017/02/04 11:21総合スコア4443
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/02/04 11:10

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/02/04 06:09