【问题标题】:A way to use Openssl in different languages/platforms一种在不同语言/平台中使用 Openssl 的方法
【发布时间】:2015-09-09 00:20:23
【问题描述】:

众所周知,Openssl 是加密世界的标准。 Openssl 是用纯 C 编写的,那么问题来了,如何在不同的语言中使用 Opnessl?这样的Java。虽然 Java 提供了JCEBouncyCastle,但很难知道它们是否存在实现偏差,即对于相同的输入(合法或无效),JCE 和 Openssl 输出不同的结果。

到目前为止,我想出的是直接调用 openssl 命令。在实际产品中,如何解决这个问题?

非常感谢任何帮助。

【问题讨论】:

标签: java c openssl cryptography


【解决方案1】:

OpenSSL 使用标准化算法,这意味着无论您使用哪个库,相同密钥和算法的解密结果都是相同的。

例如:
如果您使用密钥“我是河豚”的 BlowFish 加密算法,并使用 OpenSSL 对其进行加密,您可以使用任何您想要解密的库并获得相同的结果。

话虽如此,可以在任何语言或操作系统中使用 OpenSSL 库(通常是 libcrypto 和 libssl)。不过,它确实需要一些管道。
在您的示例中,您可以使用 JNI 直接访问 OpenSSL 库函数。
这种方法要求您确保拥有适合您的目标架构和操作系统的库。

个人? 我会看看为什么会有偏差,因为这是你的主要问题。

【讨论】:

  • 例如,即使对于 Base64 等简单算法,PC 中的 JVM 的行为也与 Android 不同。 (有人在 Stackoverflow 上发布了这个问题)。我希望客户端和服务器都使用相同的加密库以避免潜在的“偏差”。
  • 那么无论如何 - 使用相同的库。只要确保为您的架构使用正确的库即可。你知道如何使用jni吗?
  • ,.谢谢,我将尝试为 openssl 绑定 JNI。希望 JNI 不会复杂
  • 您能否提供您在加密库中看到不同行为的链接?
【解决方案2】:

如何在不同语言中使用 Opnessl?这样的Java。

  • 在 Java 中使用 JNI。它可以非常快。注意 JNI 的“固定”概念——本机方法接收指向元素的直接指针——无需复制——但这有一些含义。固定是可选的。要使用 JNI,通常应该创建包装函数来调用目标函数(在我们的例子中是 OpenSSL)。所以你应该根据JNI规则(参数类型jint等)创建共享库(DLL左右)并调用OpenSSL函数。

  • 这取决于语言 - 通常在托管语言中,您应该包装 C 代码(例如在 COM 或托管 C++ 中以在 .NET 中使用)。在 C++ 中 - 直接。 C#也有调用C函数的机制。

【讨论】:

  • 感谢您的回答。 JNI能够执行C代码,但我不确定我是否必须修改openssl的源代码。我更喜欢找到一种在 Java 中执行 openssl 的“快速”方式;虽然执行 shell 很快,但我无法控制异常。
  • 已更新 - 您不应更改 OpenSSL 代码 - 创建包装器。这并不难。
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2014-03-12
  • 2021-03-09
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多