部署应用程序时如何避免安装“无限强度”JCE策略文件?

2024-02-29

我有一个使用 256 位 AES 加密的应用程序,Java 不支持该加密。我知道为了让它正常工作,我在安全文件夹中安装了 JCE 无限强度 jar。这对我作为开发人员来说很好,我可以安装它们。

我的问题是,由于此应用程序将被分发,最终用户很可能不会安装这些策略文件。让最终用户下载这些只是为了使应用程序发挥作用并不是一个有吸引力的解决方案。

有没有办法让我的应用程序运行而不覆盖最终用户计算机上的文件?第三方软件可以在不安装策略文件的情况下处理它吗?或者只是从 JAR 中引用这些策略文件的方法?


对于这个问题,有一些常见的解决方案。不幸的是,这些都不能完全令人满意:

  • 安装无限强度策略文件 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html.虽然这可能是适合您的开发工作站的正确解决方案,但让非技术用户在每台计算机上安装文件很快就会成为一个主要麻烦(如果不是障碍)。有no way与您的程序一起分发文件;它们必须安装在 JRE 目录中(由于权限的原因,该目录甚至可能是只读的)。
  • 跳过 JCE API并使用另一个密码学库,例如充气城堡 http://www.bouncycastle.org/。这种方法需要额外的 1MB 库,根据应用程序的不同,这可能是一个很大的负担。复制标准库中包含的功能也感觉很愚蠢。显然,该API也与通常的JCE接口完全不同。 (BC 确实实现了 JCE 提供程序,但这没有帮助,因为应用了密钥强度限制before移交给实现。)此解决方案也不允许您使用 256 位 TLS (SSL) 密码套件,因为标准 TLS 库在内部调用 JCE 来确定任何限制。

但随之而来的是反思。有什么是不能使用反射做的吗?

private static void removeCryptographyRestrictions() {
    if (!isRestrictedCryptography()) {
        logger.fine("Cryptography restrictions removal not needed");
        return;
    }
    try {
        /*
         * Do the following, but with reflection to bypass access checks:
         *
         * JceSecurity.isRestricted = false;
         * JceSecurity.defaultPolicy.perms.clear();
         * JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE);
         */
        final Class<?> jceSecurity = Class.forName("javax.crypto.JceSecurity");
        final Class<?> cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions");
        final Class<?> cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission");

        final Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");
        isRestrictedField.setAccessible(true);
        final Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL);
        isRestrictedField.set(null, false);

        final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy");
        defaultPolicyField.setAccessible(true);
        final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null);

        final Field perms = cryptoPermissions.getDeclaredField("perms");
        perms.setAccessible(true);
        ((Map<?, ?>) perms.get(defaultPolicy)).clear();

        final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE");
        instance.setAccessible(true);
        defaultPolicy.add((Permission) instance.get(null));

        logger.fine("Successfully removed cryptography restrictions");
    } catch (final Exception e) {
        logger.log(Level.WARNING, "Failed to remove cryptography restrictions", e);
    }
}

private static boolean isRestrictedCryptography() {
    // This matches Oracle Java 7 and 8, but not Java 9 or OpenJDK.
    final String name = System.getProperty("java.runtime.name");
    final String ver = System.getProperty("java.version");
    return name != null && name.equals("Java(TM) SE Runtime Environment")
            && ver != null && (ver.startsWith("1.7") || ver.startsWith("1.8"));
}

只需致电removeCryptographyRestrictions()在执行任何加密操作之前从静态初始化程序等中获取。

The JceSecurity.isRestricted = false部分是直接使用 256 位密码所需的全部;然而,如果没有其他两项操作,Cipher.getMaxAllowedKeyLength()仍将继续报告 128,并且 256 位 TLS 密码套件将不起作用。

此代码适用于 Oracle Java 7 和 8,并在 Java 9 和 OpenJDK 上自动跳过不需要的进程。毕竟,这是一个丑陋的黑客行为,它可能无法在其他供应商的虚拟机上运行。

它也不适用于 Oracle Java 6,因为私有 JCE 类在那里被混淆了。不过,混淆不会因版本而异,因此技术上仍然可以支持 Java 6。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部署应用程序时如何避免安装“无限强度”JCE策略文件? 的相关文章

随机推荐

  • Clearfix 与 Twitter 引导程序

    我对 twitter bootstrap 有一个问题 对我来说看起来有点奇怪 我有一个固定在左侧的侧边栏和一个主要区域 div div ul li A li li A li li C li li D li li E li li F li l
  • 如何在 Visual Studio 2010 中添加 SIMD 相关编译器标志

    我找到了这个标志列表 http www ncsa illinois edu UserInfo Resources Software Intel Compilers 10 0 main for mergedProjects optaps fo
  • 如何在keras中可视化卷积神经网络中间层的输出?

    最近我创建了用于猫和狗分类的基本 CNN 模型 非常基本 如何使用 keras 可视化这些层的输出 我使用 keras 的 Tensorflow 后端 您可以定义一个模型 获取您想要查看的每一层的输出并进行预测 假设您有完整的模型 cnnM
  • 没有工作树就无法使用 git-pull

    我正在尝试从我刚刚设置的远程存储库中提取数据 并且收到了消息 没有工作树就无法使用 git pull 我读过的所有内容似乎都指向我的 git 目录 但看起来不错 git branch 给出输出 master and git ls tree
  • 处理回发数据中的数组 - MVC3

    我目前是一名 WebForms 开发人员 正在尝试转向 MVC 我对 MVC 感到非常兴奋 而且我真的很开心 但我遇到了一个奇怪的问题 所以我想做的是为 小部件 创建一个高级编辑器 我已经发布了下面的代码 当您添加前 4 5 个项目时 一切
  • python asyncio 和 httpx

    我对异步编程非常陌生 我正在尝试使用 httpx 我有以下代码 我确信我做错了什么 只是不知道它是什么 有两种方法 一种是同步 另一种是异步 它们都来自谷歌金融 在我的系统上 我看到花费的时间如下 异步 5 015218734741211同
  • 整洁地替换为一个奇怪的字符

    我正在使用 Tidy 带有 PHP5 并启用 UTF8 输入 输出和字符编码 当我用清洁器清洁绳子时 nbsp 在其中 它用一个奇怪的字符替换它 我尝试过弄乱整洁的配置 但我尝试的任何操作似乎都不起作用 整理前 This is a test
  • GDB - 神秘的汇编代码是什么?

    Dump of assembler code for function main 0x0804833e lt 0 gt push ebp 0x0804833f lt 1 gt mov esp ebp 0x08048341 lt 3 gt s
  • 指标过滤器未分配给指标警报

    我正在使用 terraform 设置 aws cloudwatch 日志 以便在日志中出现错误时发送电子邮件 terraform 文件如下所示 resource aws cloudwatch log metric filter error
  • 对象配置必须是包含 yii2 和 mongodb 中“class”元素的数组

    登录或注册时出现错误 gt yii2 mongodb给出一个错误 MongoDB 与 yii2 的连接已完成 请帮我解决这个问题 main local php return components gt mongodb gt class gt
  • 如何在 Vuetify 行上将“光标”设置为“指针”?

    如何设置cursor pointer在 Vuetify 上
  • Xcode 4.x 中代码自动完成/语法突出显示的问题

    我在我的一个项目中的 Xcode 中遇到了一个相当奇怪的问题 当我开始编写代码时 我习惯了自动完成功能为我建议大量条目 由于某种原因 从昨天开始 它就停止工作了 我现在收到奇怪的自动完成条目 例如 and the Andy MyCompan
  • 找出按下的键的字符

    如果我向 KeyboardEvent KEY DOWN 添加一个侦听器 我可以找到 keyCode 和 charCode keyCode 根据键盘映射到不同的字符 根据帮助 charCode 同样没用 字符代码值是英文键盘值 例如 如果按
  • 如何使用 PHP 过滤 MySQL 中的数据(一对多关系)

    我想做的事 用户将使用发送一个值GET我会将值存储在名为的变量中 category1 现在包含值的所有行 category1将显示 这就像一个搜索系统 这是我的代码 stmt conn gt prepare SELECT tmdb movi
  • PHP 中有一个像样的 HTML-table-generator 类吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在 PHP 中寻找一个像样的类 它将生成复杂的 HTML 表格 即它应该支持 colspan rowspan 以及行 列和单元格的单独
  • 身份验证类型名称如何在 asp.net vnext 中注册

    因此 我正在更新 MongoDB 的开源 asp net 身份提供程序 以便与 Asp Net Identity 3 0 又名 vnext 配合使用 到目前为止 我已经能够注册提供程序并创建用户 但是在使用 SignInManager 时
  • 从缓存对象中转换 ValueTuple

    当我检查缓存以查看我的 ValueTuple 是否在缓存中时 我使用下面的代码 在这种情况下 返回的值为 null 即缓存中不存在 当代码运行时我得到object not set to instance of an object第一行错误
  • 如何测试 AccessViolationException 的处理

    我需要编写一个测试来验证我的代码是否可以处理 AccessViolationException 或任何其他 WIN32 损坏状态异常 CSE 该异常在不安全的上下文中发生 通常通过调用第 3 方库来处理 这一切都应该在 net 4 0 上使
  • 如何在 IPython 笔记本中播放本地视频?

    我有一个本地视频文件 avi 但可以转换 我想向客户端展示该文件 即它是私有的 无法发布到网络 但我不知道如何在 IPython 笔记本中播放它 经过一番谷歌搜索后 似乎 HTML5 视频标签可能是可行的方法 但我不知道任何 html 无法
  • 部署应用程序时如何避免安装“无限强度”JCE策略文件?

    我有一个使用 256 位 AES 加密的应用程序 Java 不支持该加密 我知道为了让它正常工作 我在安全文件夹中安装了 JCE 无限强度 jar 这对我作为开发人员来说很好 我可以安装它们 我的问题是 由于此应用程序将被分发 最终用户很可