跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java RSA 数字签名实现与校验详解

Java RSA 数字签名通过私钥生成签名、公钥验证签名的机制保障数据完整性。示例展示了基于 java.security 包的核心实现流程,包括密钥对生成、文件内容读取、MD5WithRSA 算法签名及校验逻辑。代码包含完整的工具类封装,演示了 FileInputStream 读取文件并计算签名的具体步骤,适用于基础安全场景下的身份认证与防篡改需求。注意生产环境建议升级哈希算法。

菩提发布于 2017/10/7更新于 2026/9/1170 浏览
Java RSA 数字签名实现与校验详解

Java RSA 数字签名实现与校验详解

数字签名是非对称加密的典型应用场景,利用私钥对数据进行签名,公钥负责验签,从而保证数据未被篡改且来源可信。下面通过一个完整的工具类演示如何在 Java 中实现这一过程。

密钥生成

首先需要生成 RSA 密钥对。这里使用 1024 位长度,实际生产中建议 2048 位以上。

public void generateKey() {
    try {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp = kpg.genKeyPair();
        pbkey = kp.getPublic();
        prkey = kp.getPrivate();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

签名与校验

签名时读取文件内容,用私钥计算摘要;校验时再次读取文件,用公钥比对签名结果。

public byte[] sign(String path) throws Exception {
    FileInputStream f = new FileInputStream(path);
    int num = f.available();
    byte[] data = new byte[num];
    f.read(data);
    RSAPrivateKey prk = (RSAPrivateKey)prkey;
    Signature s = Signature.getInstance("MD5WithRSA");
    s.initSign(prk);
    s.update(data);
    return s.sign();
}

public void checkSign(String path, byte[] signeddata) throws Exception {
    FileInputStream f = new FileInputStream(path);
    int num = f.available();
    byte[] data = new byte[num];
    f.read(data);
    RSAPublicKey pbk = (RSAPublicKey)pbkey;
    Signature s = Signature.getInstance("MD5WithRSA");
    s.initVerify(pbk);
    s.update(data);
    boolean ok = s.verify(signeddata);
    System.out.println(ok ? "验证成功" : "验证失败");
}

测试示例

public static void main(String args[]) throws Exception {
    DigitalSignDemo ds = new DigitalSignDemo();
    ds.generateKey(); // 产生私钥和公钥
    byte[] signeddata = ds.sign("test.txt"); // 文件签名
    ds.checkSign("test.txt", signeddata); // 校验签名
}

注意:MD5 算法已不再推荐用于高安全场景,生产环境请改用 SHA256WithRSA。

目录

  1. Java RSA 数字签名实现与校验详解
  2. 密钥生成
  3. 签名与校验
  4. 测试示例

更多推荐文章

查看全部
  • Ghostty + Yazi + Lazygit:构建现代化终端开发环境
  • System Verilog 教程:从基础到高级验证
  • Dragonwell17 JDK 快速上手与性能调优实战
  • 本地部署 Z-Image-Turbo 进行 AI 绘画全流程指南
  • LLaMA 大模型微调实践与 LoRA 调优指南
  • Qwen-Image-2512 ComfyUI 部署实战:提升 AI 绘画真实感
  • Blender 插件 Cats 用于 VRChat 模型优化指南
  • 前端状态管理:Recoil 原子化方案详解
  • GitHub Copilot CLI 斜杠命令速查表
  • Tauri 前端配置指南:接入 Vite/Next/Nuxt/SvelteKit 等主流框架
  • 六款大模型应用开发常用工具库
  • Windows Server 2022/2025 搭建 Web 服务器实验指导
  • 单链表核心操作全实现:查找、插入与删除的深度解析
  • macOS 指定版本升级指南:从 15.3 升级至 15.4 而非最新版
  • GitHub Copilot 学生认证指南:免费获取 Pro 版权限
  • eBay API 授权码无效或过期错误排查指南
  • WebAssembly 结合 RustFS:浏览器端高性能文件管理方案
  • Streamlit 实战指南:用 Python 快速构建数据 Web 应用
  • OpenClaw 龙虾机器人本地部署与进阶配置指南
  • 2025 年秋招 LLM 及多模态模型面试精华

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online