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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

PHP

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

JavaScript

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

Q&A

解決済

6回答

15489閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

PHP

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

JavaScript

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

0グッド

1クリップ

投稿2017/02/04 05:33

編集2017/02/04 06:12

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

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

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

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

となると思います。

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

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

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


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

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

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

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

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

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

guest

回答6

0

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

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

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

投稿2017/02/04 05:42

maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2017/02/04 06:09

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

0

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

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

  • 普通の人(パラメータを見ることができるだけの人)

難読化されたパラメータから元パラメータを解読しにくい手段を選びます。
BASE64文字列を反転する、共通鍵で暗号化するなどなんでもよいです。

  • 少し詳しい人(クライアントコードを見れる人)

「パラメータを難読化するクライアント側コード(javascript)」を難読化します。
その強度は難読化ツールによって異なると思いますが、原理的に解読可能なので気休め程度にしかなりません。

投稿2017/02/04 15:18

編集2017/02/04 15:46
can110

総合スコア38266

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

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

hsk

2017/02/05 23:54

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

退会済みユーザー

2017/02/06 05:39

ありがとうございます! >「他人」とはどこにいる、どんな人なのかを考えてみましょう。 そうですね・・・通信経路の途中ではなく、サイトを見れる人全てです。 サイトを開けばURLが表示・取得できますので、それを見ることができる環境にある人全てが対象となります。 曖昧で申し訳ございません・・・。 それと難読化、たしかにそちらのほうが正しいかもしれません。 正直、「パラメーターが平文にできたからといってそれが攻撃材料になるか?」といえば、なりません。 そのURLパラメーターを持つサーバー内にその情報があるわけでもないので、そのパラメーターを使ってサーバーを攻撃しようとしても何も起こらないです。 質問にも書いたように「今日2月4日は晴れ」というレベルの内容なので、どちらかというと難読化のほうが質問の意図としてはただしいかもしれませんね。 それとhskさん、すみませんソルトの意味を誤解しておりました。 ご説明いただきましてありがとうございます。
guest

0

ベストアンサー

こんにちは。

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

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


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

投稿2017/02/04 14:41

tamoto

総合スコア4110

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

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

退会済みユーザー

退会済みユーザー

2017/02/06 05:32

ありがとうございます! >クライアント側含め、どの環境でも復号可能でなければならないということなら いえ、どの環境でも復号可能ではなく復号するための鍵は自分だけが持っていればいいかんじです。 ですので共通鍵でもよいですし、公開鍵でも構わないのでRSAは良いかもしれませんね。
tamoto

2017/02/06 05:46

その要件なら、素直に真面目な暗号化を施すなら公開鍵が良いでしょう。 > ですので共通鍵でもよいですし、 一応念のため。共通鍵を(クライアントの手に届くように)配布するやり方だと、「通信経路上の他人」でも復号可能となる危険性があることは認識しておいて下さいね。公開鍵ならそうはなりません。
退会済みユーザー

退会済みユーザー

2017/02/07 16:39

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

0

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

Re: x25m さん

投稿2017/02/07 07:28

think49

総合スコア18164

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

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

退会済みユーザー

退会済みユーザー

2017/02/07 16:38

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

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
alg

総合スコア2019

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

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

退会済みユーザー

退会済みユーザー

2017/02/07 16:37

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

0

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

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

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

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

(追記)

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

投稿2017/02/04 11:00

編集2017/02/04 11:21
ikedas

総合スコア4335

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

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

退会済みユーザー

退会済みユーザー

2017/02/04 11:10

ありがとうございます! URLパラメーターはいろいろな用途に使えるので、単にそのように使いたいというだけです。 パスワードでもないですし最悪漏れてもいいような情報です。 すみません・・・本題からそれますので用途についての回答は控えたいと思うのですが・・・。 RC4についてのご回答ありがとうございます。 こちらについていくつか見てみました。 共通鍵を使う点なのですね。 まだ詳しく調べきっていませんが非常に用途にあっているような気がします! とても助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問