【发布时间】:2020-03-01 15:21:20
【问题描述】:
场景
我们正在开发一个使用 Java 前端并在 C++ 端实现更复杂数学算法的应用程序。为此,有通过 JNI 实现的 Java native 函数,以通过 Java 访问 C++ 功能。
问题
从历史上看,我们遇到了越来越多的凭证在相对较大的代码库中飞来飞去的问题,几乎都是 Java 端,一些可配置的凭证在应用程序特定的配置文件中,后者可以忽略 wrt这个问题的范围。
我们希望提高应用程序的安全性。我们面临的问题是我们的应用程序必须能够离线运行,因此无论我们使用什么私钥来解密我们的数据,它将与应用程序一起交付。我们正在考虑我们的选择,但它们似乎都不安全:
- 保留密码 Java 端并使用
crypto包 - 仍然可以识别加密算法,并且要加密的密码仍然必须公开存储在某个地方,因此可以相对容易地解密。此外,JAR 相对容易访问。 - 保留密码 C++ 端并使用函数
decryptKey传递密码,使用私钥对其进行 C++ 端解密,然后将其返回原样。在这种情况下,JNI 就成为了漏洞,因为很容易构建自己的 JAR,包含我们的 DLL,然后访问本机的decryptKey函数来检索纯文本密码。 - 将所有与键相关的逻辑转移到 C++。这没有什么意义,因为我们必须将逻辑转移到不属于它的地方。此外,一些实现需要需要提供凭据的第 3 方 Java API,因此遗憾的是,这不是一个选项。
问题
想必这在业内并不少见,那么最明智的处理方法是什么?目前这些方法只引入了通过默默无闻的安全性,其有效性充其量是值得商榷的,最坏的情况是勉强高于零。行业内是否有标准程序如何处理?
【问题讨论】:
-
challenge-response 算法(通常用于身份验证)更不稳定(比密钥轮换更好)。当然还有钥匙装在钥匙店里。
-
"无论我们使用什么私钥解密我们的数据,它都会随应用程序一起交付" ...你注定要失败。
标签: java c++ encryption java-native-interface