6

我目前正在开发一个客户端-服务器程序,Java/C 中的客户端和 C 中的服务器。我必须传输加密数据(比如客户端应该将数据传递给服务器以加密/解密,计算摘要等),服务器必须将结果返回给客户端。

在这种情况下,我意识到使用一些传输协议来识别数据和有效传递数据的重要性。

在这方面,我的问题是:ASN.1 是一个很好的协议吗?我知道 BC(Java 上)和 C 上的 OpenSSL 支持它。那么使用 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 是另一种来自地狱的破碎技术,恕我直言,最好避免使用。当然,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 工具之一,并将您对 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 回答