JavaJDK实现无钥签名根证书与沙箱安全机制

2023-11-14

1,起因:接到项目经理的需求,项目有涉及文件的上传,需要把上传的文件进行数字签名,简称无钥签名,然后对签名后的文件进行无钥验证,对于从来没有听过无钥签名的我感觉很懵,后面就去上网查数字签名是java的哪一块,得到以下结果:

Java里其实有两大机制,第一是双亲委派机制,第二是沙箱安全机制,双亲委派机制相信大家学习jvm的类加载器时肯定都有做了解,那这个沙箱安全机制是什么呢

什么是沙箱安全机制

        Java安全模型的核心就是Java沙箱(sandbox),什么是沙箱?沙箱是一个限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(IVM)特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏.沙箱主要限制系统资源访问,那系统资源包括什么? CPU、内存、文件系统、网络。不同级别的沙箱对这些资源访问的限制也可以不一样。所有的Java程序运行都可以指定沙箱,可以定制安全策略。

Java沙箱演变的一个过程

在Java中将执行程序分成本地代码和远程代码两种,本地代码默认视为可信任的,而远程代码则被看作是不受信的。对于授信的本地代码,可以访问一切本地资源。而对于非授信的远程代码在早期的Java实现中,安全依赖于沙箱 (Sandbox) 机制。如下图所示 JDK1.0安全模型

但如此严格的安全机制也给程序的功能扩展带来障碍,比如当用户希望远程代码访问本地系统的文件时候,就无法实现。因此在后续的 Java1.1 版本中,针对安全机制做了改进,增加了安全策略,允许用户指定代码对本地资源的访问权限。如下图所示 JDK1.1安全模型

 在 Java1.2 版本中,再次改进了安全机制,增加了代码签名。不论本地代码或是远程代码,都会按照用户的安全策略设定,由类加载器加载到虚拟机中权限不同的运行空间,来实现差异化的代码执行权限控制。如下图所示 JDK1.2安全模型

当前最新的安全机制实现,则引入了域 (Domain) 的概念。虚拟机会把所有代码加载到不同的系统域和应用域,系统域部分专门负责与关键资源进行交互,而各个应用域部分则通过系统域的部分代理来对各种需要的资源进行访问。虚拟机中不同的受保护域 (Protected Domain),对应不一样的权限 (Permission)。存在于不同域中的类文件就具有了当前域的全部权限,如下图所示 最新的安全模型(jdk 1.6)

组成沙箱的基本组件

1,字节码校验器(bytecode verifier):确保Java类文件遵循Java语言规范。这样可以帮助Java程序实现内存保护。但并不是所有的类文件都会经过字节码校验,比如核心类。

2,类装载器(class loader) :其中类装载器在3个方面对Java沙箱起作用

  •         它防止恶意代码去干涉善意的代码;
  •         它守护了被信任的类库边界;
  •         它将代码归入保护域,确定了代码可以进行哪些操作。

        虚拟机为不同的类加载器载入的类提供不同的命名空间,命名空间由一系列唯一的名称组成,每一个被装载的类将有一个名字,这个命名空间是由Java虚拟机为每一个类装载器维护的,它们互相之间甚至不可见。

  类装载器采用的机制是双亲委派模式

        1,从最内层JVM自带类加载器开始加载,外层恶意同名类得不到加载从而无法使用;

        2,由于严格通过包来区分了访问域,外层恶意的类通过内置代码也无法获得权限访问到内层类,破坏代码就自然无法生效。

3,存取控制器(access controller):存取控制器可以控制核心API对操作系统的存取权限,而这个控制的策略设定,可以由用户指定。

4,安全管理器(security manager):是核心API和操作系统之间的主要接口。实现权限控制,比存取控制器优先级高。

5,安全软件包(security package) : java.security下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性,包括:

  • 安全提供者
  • 消息摘要
  • 数字签名 keytool
  • 加密
  • 鉴别

我的应用

说了这么多,而我项目文件签名与验证功能涉及的就是组件安全软件包里的数字签名,接着我拿到拿到了给我的证书,安装证书才具备数字签名的环境。

 导入证书

前提是安装了java环境配置了环境变量

以管理员的身份运行cmd然后输入命令后输入y就会提示安装成功,Liunx命令如下

keytool -import -v -trustcacerts -alias aaa -file aaa.cer -storepass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts

Windows:执行证书导入命令时,更新地址替换为%JAVA_HOME%/jre/lib/security/cacerts

第一个aaa代表是证书别名,第二aaa代表证书名称,-keystore后代表安装地址,其实装其他一些类型的证书是也可以发现关于一些安装证书安装都是安装在Java\jdk1.8.0_211\jre\lib\security下的java.security文件里的

注意:这里说一个踩过的坑,之前我证书已经导入成功,但是项目环境中就是不具备证书,然后提示我签名失败,无效的证书,

后面发现我项目运行环境是使用的jre,但是我安装的路劲是jdk下的jre下的文件导致一直提示我没有证书,然后我把环境切换成jdk 。问题得到解决


总结:数字签名数字验证里面怎么签怎么验的代码是由第三方提供的,我在开发中无权过问他们的代码,只是项目需要他们的远程代码的服务,导入证书目的就是为了让他们的代码让我们这边的环境给他个权限,能让他运行,这就与java的最新沙箱安全机制相关联起来了,

在此只介绍了为什么要进行导入证书和介绍了一下沙箱,相信小伙伴很关心我签和验的一个过程,其实这个过程也很简单,具备他们代码运行的环境后只需要知道他们各个接口是干什么的就可以完成项目经理的需求了,这里接口相关文档与调用相关代码就不方便公开,每个公司有每个公司的不同,谢谢大家理解!

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

JavaJDK实现无钥签名根证书与沙箱安全机制 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐

  • 报时机器人的rasa shell执行流程分析

    本文以报时机器人为载体 介绍了报时机器人的对话能力范围 配置文件功能和训练和运行命令 重点介绍了rasa shell命令启动后的程序执行过程 一 报时机器人项目结构 1 对话能力范围 1 能够识别欢迎语意图 greet 和拜拜意图 good
  • Linux 或者 Docker 容器通过 date 设置系统时间

    目录 1 Linux 2 Docker 容器 2 1 进入容器内部修改 2 2 可能会遇到的问题 1 Linux 要在Linux系统中设置日期和时间 可以使用date命令 使用以下命令格式来设置日期和时间 sudo date s YYYY
  • kubernetes二进制单节点和多节点部署(多节点+dashbord)

    kubernetes二进制单节点和多节点部署 多节点 dashbord kubernetes单节点部署 环境准备 在 master01 节点上操作 上传 master zip 和 k8s cert sh 到 opt k8s 目录中 解压 m
  • YOLOv5 Focus C3 各模块详解及代码实现

    目录 yolov5s yaml yolov5s yaml基本参数含义 一些基本参数 BackBone Head Focus 一 Focus模块的作用 Focus的参数量 Yolov3和Yolov5的改进对比 关于Focus的补充 网络结构图
  • 轻量级人像分割深度学习模型PP-HumanSeg树莓派部署

    人像分割是图像分割领域的高频应用 PaddleSeg推出在大规模人像数据上训练的人像分割系列模型PP HumanSeg 包括超轻量级模型PP HumanSeg Lite 满足在服务端 移动端 Web端多种使用场景的需求 本项目将PP Hum
  • Ceph分布式存储详解

    一 Ceph概述 1 存储发展史 企业中使用存储按照其功能 使用场景 一直在持续发展和迭代 大体上可以分为四个阶段 DAS Direct Attached Storage 即直连存储 第一代存储系统 通过SCSI总线扩展至一个外部的存储 磁
  • ChatGPT泄露用户聊天记录标题;Adobe加入AIGC战局;阿里大模型前带头人杨红霞加盟字节跳动丨每日大事件...

    数据智能产业创新服务媒体 聚焦数智 改变商业 企业动态 诸葛智能推出 诸葛CDP 2 0 等三大产品升级 3月22日 容联云旗下场景化数据智能服务商 诸葛智能 举办2023春季发布会 推出客户数据管理平台 诸葛CDP 2 0 一站式用户行为
  • freemarker动态生成word和pdf

    1 使用freemarker生成word freemarker生成word的方法网上有很多 比较简单 基本上都差不多 所需工具 freemarker
  • Python爬虫之Js逆向案例(3)-X品牌手机社区

    声明 XX手机社区加密逆向分析仅用于研究和学习 这篇文章的学习内容是以XX手机社区为案例 对JS逆向的整个过程进行详细分析 下面会进行以下几步进行分析 下方演示过程全部使用chrome浏览器 锁定关键接口 锁定关键字段 破解关键字段 pyt
  • (Java)leetcode-4 Median of Two Sorted Arrays(寻找两个正序数组的中位数)

    题目描述 给定两个大小为 m 和 n 的正序 从小到大 数组 nums1 和 nums2 请你找出这两个正序数组的中位数 并且要求算法的时间复杂度为 O log m n 你可以假设 nums1 和 nums2 不会同时为空 示例 1 num
  • 三步实现Android任意控件悬浮效果

    Tag 项目介绍 之前做项目的时候实现的一个悬浮效果 如图 可能不够清晰 接下来就是实现效果 如图所示 demo直接用的截图 原理很简单 用RecyclerView addHeaderView的方式实现 实现步骤 1 添加依赖 compil
  • 树莓派——linux内核与驱动

    文章目录 Linux内核基础框架 内核结构框图 linux系统架构 shell 驱动 为什么要学习写驱动 什么是驱动 硬件设备分类 文件名与设备号 驱动结构框图的认知 内核的 sys open sys read 会做什么 驱动程序开发步骤
  • 过采样和欠采样

    一 采样定理 只要采样频率高于信号最高频率的两倍 就可以从采样信号中恢复出原始信号 二 过采样和欠采样 1 采样频率高于信号最高频率的两倍 这种采样被称为过采样 2 采样频率低于信号最高频率的两倍 这种采样被称为欠采样 三 基带信号和频带信
  • 计算机网络知识点汇总

    主要内容 基本概念 物理层 数据链路层 网络层 传输层 应用层 一 基本概念 计算机网络 按照某种协议进行数据通信 实现硬件资源和软件资源的共享 分类 分布范围 使用者 交换技术 拓扑结构 传输技术 计算机网络的体系结构 ISO OSI参考
  • @RequestParam、@PathVariable、@RequestBody、@ResponseBody注解辨析

    RequestParam RequestParam 将请求参数绑定到你控制器的方法参数上 是springmvc中接收普通参数的注解 例如 defaultValue为给name设定默认值 RequestParam中的value值必须跟http
  • UML笔记

    UML笔记 枫叶云笔记
  • GLSL-TBN矩阵

    TBN矩阵 一 简述 1 1 TBN矩阵作用 我们研究一个矩阵的时候通常需要了解一个矩阵是从哪一个空间或者说矩阵而来的 如果搜索一下TBN矩阵运算公式可以发现其决定于物体坐标系下的顶点和纹理坐标系下的纹理坐标 想到这里我们需要明确TBN运算
  • 数据库服务版本升级

    数据库版本升级方法 第一种方法 本地升级 数据库服务5 6 5 7 8 0 停库 第二种方法 迁移升级 数据库服务数据迁移到另一台新的数据库服务中 旧版数据库服务地址 10 0 0 51 网络停止 新版数据库服务地址 10 0 0 51 8
  • AR回归模型详解

    转 http geodesy blog sohu com 273714573 html 1 自回归模型的定义 自回归模型 Autoregressive Model 是用自身做回归变量的过程 即利用前期若干时刻的随机变量的线性组合来描述以后某
  • JavaJDK实现无钥签名根证书与沙箱安全机制

    1 起因 接到项目经理的需求 项目有涉及文件的上传 需要把上传的文件进行数字签名 简称无钥签名 然后对签名后的文件进行无钥验证 对于从来没有听过无钥签名的我感觉很懵 后面就去上网查数字签名是java的哪一块 得到以下结果 Java里其实有两