(オープン)ソースコードでの文字列の秘密の保持


50

Android用のアプリの開発が完了し、GPLで公開するつもりです-オープンソースにしたいです。ただし、アプリケーション(ゲーム)の性質は、なぞを尋ね、文字列リソースにコード化された回答を持っていることです。答えを公開できません!パスワードを安全に保存することを検討するように言われましたが、適切なものが見つかりませんでした。

隠された、暗号化された、または隠された文字列配列を使用してソースコードを公開することは可能ですか?たぶんオンラインデータベースから答えを読むことで?

更新

以下のYuval Filmusのソリューションが機能しました。私が最初にそれを読んだとき、私はまだそれをする方法がわかりませんでした。2番目のオプションに対するいくつかのソリューションを見つけました。ハッシュされたソリューションをソースに保存し、ユーザーが推測するたびにハッシュを計算します。javascriptでこれを行うには、http: //code.google.com/p/crypto-js/にcrypto-jsライブラリがあります。Androidの場合、MessageDigest関数を使用します。呼ばれる(fdroid / githubの上の)アプリケーションがありHashPassこれを行います。


11
これはどのようにここにあるのだろうか。いずれにせよ、情報セキュリティにより適している可能性があります。
ラファエル

2
@YuvalFilmus「Hot Question」投票にだまされないでください。しかし、要点。
ラファエル

4
ここに欠けている重要な詳細は次のとおりです。ユーザーの回答を確認するだけですか、それとも正しい回答も印刷できるようにしますか?また、ファジーが必要ですか、それとも明確な限られた正解のセットだけがありますか(これにより、このセットに対してユーザーの回答を1つずつ確認できます)。
ハイド14年

4
すべての答えは、あなたが解決したい問題は何かを尋ねています。答えを公開できないのはなぜですか?
ライモイド14年

1
これらの文字列を使用してコードで何ができる必要がありますか?それらをデコードできる必要がありますか?または、文字列をそれらと比較することで十分ですか?
デビッドシュワルツ14年

回答:


83

解決したい問題に応じて、少なくとも2つのオプションがあります。

コードの無邪気な読者が誤って答えを受け取らないようにしたい場合、または少なくともユーザーを誘惑しないように少し難しくしたい場合は、ソリューションを暗号化し、コードの一部としてキーを保存できます。計算の結果(さらに難しくするため)。

あなたがしたい場合は防ぐことの答えを取得からユーザーを、あなたは、一方向関数を使用するか、またはコンピュータの専門用語、中にできるハッシュ関数。答えのハッシュを格納し、彼らはあなたの答えは、それが答えを推測することが可能であることなく、正しいかどうかをテストすることができ、すべての最初にそれを見つけることなく。これには、正しい答えに近い答えを確認するのが難しいという欠点がありますが、この問題に対する解決策もあります。


9
私が付け加えたいことの1つは、さらにセキュリティが必要な場合は、各回答を異なるソルトでソルトする必要があることです。これにより、すべての回答に対する辞書攻撃が一度に回避されます。「実際の」暗号化の人々がそれをどのように行うかを知りたい場合は、OpenPGPのString-to-Keyシステムを見てください。
仮名14年

1
ハッシュをコードに保持するということは、すべての情報が静的であり、salt /その他のものもすぐに利用できることを意味します。結果として、回答空間が十分に大きい場合(32ビット整数値の全範囲など)、それ以外の場合(つまり、複数選択の質問の場合)レインボーテーブルはすぐに正しい答えを与えると考えられます。
アレクセイレベンコフ14年

3
Alexeiが指摘しているように、可能な入力が小さなスペースに及ぶ場合、コードに回答を保存すると、決定された攻撃者に開かれます-そして、ほとんどの謎はかなり小さな状態空間を持っていると推測しています単語または比較的小さな数字。ハッシュまたは暗号化して無害な間違いを避けることができますが、誰かが本当にそれを望んでいる答えを得ることを妨げるものはありません。(さらに、彼らはすでにあなたのなぞを解決した誰かに尋ねることができます!)
クリスヘイズ14年

4
クリスが言及していることに対抗するために、100ミリ秒かかると言う非常に遅いハッシュプロセスを選択できます(これは一部のPK標準で採用されているアプローチです)。これは、ユーザーの観点からはまだ非常に高速ですが、列挙がはるかに困難になります。
ユヴァルフィルマス14年

12
@YuvalFilmus繰り返しますが、ある程度。あなたのなぞが「犯罪者だったのはジャン、ジョー、またはジェーンだったのか?」ハッシュに1分かかる場合でも、非常に簡単に列挙できます。ゲーム全体がこのことを念頭に置いて書かれており、すべての質問が非常にオープンエンドである場合を除き、これは問題を引き起こします。しかし、はい、もしあなたの質問、状態空間が十分に大きいほど自由端であるならば、答えは保護されます。
クリスヘイズ14年

28

次の2つの 3つのオプションがあります。

答えを残りのソースコードから分離してください

コードをオープンソースにしたいが、回答をオープンソースにしたくない場合は、質問と回答を別のクローズドソース「プラグイン」として、質問と回答なしでアプリケーションのコードをオープンソースにしますまたはデータファイル。Androidアプリは、これらの両方を1つのアプリにバンドルします。

ソースコードに答えを入れてください

あるいは、質問と回答をオープンソース化の核となる部分と考える場合、他の人がそれらを読んで変更できるようにできれば難読化されていないソースコードに回答を入れる必要があります。ソースコードを難読化して理解および変更できないようにすることは、実際にはオープンソースコードの原則に沿ったものではありません。

インターネット上のサーバーに回答を置く

上記の両方のソリューションを使用すると、アプリをダウンロードした人は、どちらの場合もプログラムを再生せずに答えを見つけることができます-答えを難読化/暗号化する方法に関係なく、プログラムが追加情報なしで答えを識別できる場合、コンパイルされたアプリを人間が調べることができます。

誰も答えを見つけられないことを本当に確認したい場合、唯一の本当のオプションは、答えを与えて、答えを知りたいときにアプリにウェブサービスなどを呼び出させることではありません。アプリは、ユーザーが入力した回答を送信する必要があり、Webサービスは、回答が正しいかどうかをアプリに通知する必要があります。そのため、ユーザーは、正しい回答を取得するまで、回答が何であるかを伝えることができません(短いWebサービスを総当たり攻撃します(これを検出して保護できます)。

答えを難読化する方法を探しているなら、そもそも答えをオープンソースにしたくないことを示唆しているので、最初の選択肢を検討する必要があります。

ユーザーが事前に答えを見つけられないことが重要な場合、3番目のオプションが唯一の本当の選択肢ですが、これはユーザーの行動を妨げるため、特に努力する価値があるシナリオを考えるのに苦労していますインターネットに接続せずにアプリを使用することから。


8
Q&Aはプラグインである必要はなく、単純なデータファイルでもかまいません。入力データファイルは、ライセンスソフトウェアの一部として必ずしも含まれているわけではなく、独自の個別のライセンスでカバーできます。ソースコードで使用する(異なる)サンプルデータファイルを提供する限り、ソースまたはそのソースからコンパイルされたプログラムの自由な使用を妨げないため、GPLに違反することはありません。
ドクターJ 14年

答えが暗号化されてコードにハードコーディングされているか、別のファイルとして配布されているかに関係なく、コードが答えを解読できる必要があるため、彼のアプリをダウンロードした人は何でもできるソースコードは答えを得るためにあります。(別の回答で示唆されているように、ハッシュされない限り)
ジョニー14年

1
答えを確認することが目的であり、それらを表示する必要がない場合は、一方向ハッシュを使用したパスワードと同じ方法で行うことができます。
ジェームズライアン14年

@Justin、お返事ありがとう、それがオープンソースを構成するかどうかについてのあなたのコメントは興味深い。答えを隠すことは、ソースコードやアプリケーションの動作を難読化することではなく、チャレンジの整合性を維持することを目的としています。結局のところ、暗号は、ユーザーが推測したときにそこにいなくても謎を配布する素晴らしい手段です(「これですか、これですか?」)
Nevermore

4

オブジェクトがソースコードの偶然の読み取りから文字列を隠し、他の人が簡単に変更できるように開いたままにする場合-たとえば、テキストアドベンチャーにソースを公開していて、説明テキストを表示したくない場合これはネタバレを構成し、rot13のようなリバーシブルなものを使用します。

実際、すべての翻訳ファイルをrot13して、その場でそれらを元に戻すことができます。

それは、オープンな精神を維持しています。ランダムな「マジック」ハッシュは、実際にはプログラマーにとって使いやすいものではありません。


4
私たちの中の多くのGeoCachingの人々は、rot13をオリジナルとほぼ同じくらい流に読んだことを思い出してください。
yo

4

オープンソースでは、ゲームデータではなく、ソースコードを公開して利用可能にする必要があります。そのため、データを別のファイルに簡単に入れて、そのファイルを公開することはできません。ファイルの偶発的な読み取りを防止する場合は、暗号を追加します。アプリケーションには強力な暗号が必要だとは思いません。


1
ゲームデータをどのような意味で「公開しない」ことができますか?ゲームのコピーを持っている人がデータのコピーを持つように、ゲームはそのデータにアクセスできる必要があります。それがまさに出版とはまさにそれです。公開することです。
デビッドリチャービー14年

1
@DavidRicherby公開する内容と終了する内容に依存します。その多くの同じようなゲームを作成するために使用することができ、ゲームやあなたのエンジン?ユーザーがゲームを操作したり、セキュリティホールのコードを検査したり、コンポーネントを再利用したりできるようにしますか?インターフェイスが「CSV with q&a + program = game」のように単純な場合、CSVではなくプログラムのみを公開することも考えられます。
ラファエル

1
@Raphaelしかし、実行可能ファイルとプレーンテキストデータファイルで構成されるゲームを配布しても、答えを秘密にするという目標は達成されません。データファイルの暗号化されたバージョンを提案したい場合、これは単なる隠蔽によるセキュリティ(キーはソースにある)であると誰もが理解している限り、問題ありません。しかし、データファイルのプレーンテキストがGPLの意味でソースコードを構成するかどうかの問題に取り組み、その時点で、質問はコンピューターサイエンスではなくGPLの解釈の問題になります。
デビッドリチャービー14年

@DavidRicherby:同意しました。それでも、IANALですが、なぞなぞとその回答で構成されるデータファイルは、プログラムの重要かつかけがえのない部分と見なされ、個別にライセンスを取得することはできません-特に暗号化されていないサンプルデータファイルをソース配布物と、必要に応じて変更および暗号化するための指示とともに、ソースコードを持っている人なら誰でも独自のカスタマイズされたデータファイルを作成し、プログラムで使用できることを明確にします。
イルマリカロネン

4

ユーザーにそれらを知らせたくないのに、なぜGPLソースコードに回答を保存するのですか?それらが現在知られていないか、簡単にクラック可能であっても、それらは将来存在する可能性があります(おそらくそうなります)。

アプリに保存する代わりに、外部データベースを使用します。データベースの内容と回答を比較する小さなWebサービスを作成します。その後、検証する必要があるときはいつでも、アプリケーションにそのWebサービスを呼び出しさせます。主な問題は、インターネットアクセスが必要なため、速度と潜在的なユーザーベースが失われることです。アプリライセンスはアプリ自体にのみ適用され、ウェブサービスには適用されません。

答えを小さなデータベースに入れて、プログラムに入れることもできます。私の知る限り、GPLはソースコードにのみ適用され、アプリが保存するデータには適用されません。しかし、私はそれについて間違っているかもしれません。


1
「私が知る限り、GPLはソースコードにのみ適用され、アプリが保存するデータには適用されません」。GPLは、「このライセンスの下で、コピーを所持する人には、全体として作品全体のライセンスを取得する必要があります」と述べています。したがって、データが「作業全体」の一部であるかどうかを判断する必要があると思うかもしれません。しかし、実際には、GPLのすべての制限(その制限を含む)はライセンシーにのみ適用されます。ライセンサーにとってもGPLの精神を守ることは素晴らしいことですが、著作権警察からの訪問について心配する必要はありません。
ピーターフォード

1

データベースをリモートWebサーバーに保存する場合でも、見られたすべての正しいキー/値のペアを書き留めておくだけで、データベースを複製できることに注意してください。一般的に言えば、モバイルアプリは、ネットワークがダウンしているためにエラーを出さないか、機能を停止しないようにする必要があります(キューメッセージングを使用し、「可能な場合は更新」)。

したがって、ローカルデータベースが必要であるが、それが露骨に復号化されるという考えが気に入らない場合は、ブルームフィルターを使用できます(ネットワークと通信したり、復号化された大きなデータベースをローカルに持つことを避けるため)。これは、メモリ空間が非常に狭いときにスペルチェッカーが機能する方法でした。

したがって、次のような質問/回答のペアをフィルタに追加すると、

Hash(NormalizeString(Question [n]))+ Hash(NormalizeString(Answer [n]))

「バージニア州議会議事堂?リッチモンド」がセットに含まれているかどうかを尋ねると、「間違いなくノー」または「ほぼ間違いなくイエス」と答えます。誤検出が多すぎる場合は、データベースを大きくします。

ユーザーが予想どおりに質問と回答を正確に綴ると仮定すると、小さなスペースに巨大なデータベースを置くことができます。データベースを小さく保つことは、おそらくワイヤレスネットワーク経由で転送する必要があるため、更新に役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.