6

私は現在、クライアントサーバープログラム、Java/Cのクライアント、Cのサーバーを開発しています。暗号化データを転送する必要があります(クライアントがサーバーにデータを渡して暗号化/復号化、ダイジェストの計算などを行う必要があるなど)、サーバーは結果をクライアントに返します。

このシナリオでは、トランスポート プロトコルを使用してデータを識別し、データを効率的に渡すことの重要性を認識しています。

この点に関して、私の質問は次のとおりです。ASN.1 は使用するのに適したプロトコルですか? BC (Java の場合) と OpenSSL (C の場合) でサポートされていることは知っています。では、ASN.1 表記を使用してクライアントとサーバーの間でデータを転送することは良い考えですか?

また、これの出発点をいくつか教えてください。また、既存のプロトコルについてより良いアイデアがあれば教えてください。

ありがとう!!

4

4 に答える 4

8

BC と OpenSSL のサポートは、ASN.1 のごく一部にすぎません。実際、少なくとも一般向けには、ASN.1 の完全な実装は長い間利用できませんでした。通信事業者および電話機器の製造業者は、おそらくかなり完全な ASN.1 実装を行っています。現在、一般に公開されている最も高度な ASN.1 実装が OsmoCom プロジェクトの一部として開発されています。Harald Welte のブログ: http://laforge.gnumonks.org/weblog/2011/04/12#20110412-mapv1_available

さらに悪いことに、ASN.1、特に非常に冗長なエンコーディング スキーム (ASN.1 で文字列をエンコードする方法が少なくとも 3 つあります) は、過去数年間、いくつかのセキュリティ問題の原因となっていました。 x509 証明書を適切に処理する際に発生した問題。x509 はもう 1 つの壊れたテクノロジであり、IMHO は避けたほうがよいでしょう。確かに、SSL はそれに依存していますが「信頼できる」CA によって署名された証明書を取得しても、何の意味もありません。任意の CA が任意のドメインに署名でき、ブラウザがデフォルトで信頼するものを調べた後、ブラウザを信頼しなくなりました。

簡単に言うと、ASN.1 は壊れており、新しい設計では避けるべきです。電話ネットワーク以外で広く使用されているのは x509 だけですが、これも壊れています。したがって、私はそれを使用しません。JSON、BSON、Protocol Buffers、Netstrings、または適切なものを使用してください。

于 2011-05-11T13:30:04.907 に答える
3

ASN.1 は健在であり、現在開発中のいくつかの標準 (たとえば、3GPP および IEEE 802 内) を含む、古いものから最近のものまで、多くの標準プロトコルで使用されています。市販されている完全な商用 ASN.1 ツールがいくつかあります。一般的な ASN.1 ツールには、ASN.1 メッセージ定義からソース コードを生成できる ASN.1 コンパイラと、さまざまな標準エンコーディング ルールのエンコーディング/デコーディング ライブラリが含まれています。通常、アプリケーション開発者は、ASN.1 コンパイラによって生成されたデータ構造を使用するコードを記述し、ASN.1 ツールの一部として提供されるエンコード/デコード機能を呼び出します。

(何らかの理由で) 商用の ASN.1 ツールを入手したくない場合、および (既存の標準プロトコルを実装するのではなく) 独自の ASN.1 メッセージ定義を作成する場合は、おそらく次の方法を選択できます。利用可能な無料の ASN.1 ツールの 1 つを使用して、ASN.1 の使用を、選択したツールでサポートされている構文機能に制限します。

于 2011-05-12T16:43:40.067 に答える
2

ASN.1 は、X.509 関連のデータのみに使用されるニッチなものになりました。

代わりに、Google Protocol Buffers を確認することをお勧めします。

于 2011-05-11T12:38:25.720 に答える
0

本当に Java で ASN.1 を使用したい場合: Java 用のオープン ソース ASN.1 ライブラリを調べたところ、 BinaryNotesだけが成熟して使用できることがわかりました。このツールは、最先端の ASN.1 専門機能 (拡張ポイントなど) をすべてサポートしているわけではありませんが、独自の基本的な ASN.1 文法を定義し、それらのメッセージをエンコード/デコードできる Java クラスを生成するために使用します。ほんの少しの労力で非常に便利です。

C 部分については、同僚がASN.1Cを使用して ASN.1 文法の CODEC をコンパイルしていましたが、詳細はわかりません。

于 2011-05-12T17:05:07.943 に答える