电子签章翻车现场:Java小白30分钟搞定,别被忽悠了

avatar
小常在创业IP属地:上海
02026-02-13:22:06:08字数 2787阅读 1

上个月客户突然甩来一句:“要加电子签章,明天交。”
我心想:不就是盖个章嘛,能有多难?
结果?

  • 第一版:签完客户说“这章不认”(证书过期了)
  • 第二版:签完文件乱码(忘了转Base64)
  • 第三版:客户说“这签名能改?”(没验签!)

别慌,今天不讲法律,只教你怎么用Java把电子签章搞定。
重点:代码少到哭,坑我全踩过,你直接抄。


一、电子签章到底是个啥?(别被术语吓跑)

想象你给合同盖个数字钢印

  1. 你用私钥“刻”个章(签名)
  2. 别人用公钥“验章”(验签)
  3. 一旦文件被改,章就变色——这玩意儿比物理章靠谱多了

✅ 真实场景:
我们公司做医疗系统,客户要求电子签章。
之前用第三方API,年费3万,还卡顿。
用Java自己搞,30行代码搞定,成本=0


二、核心工具:Bouncy Castle(免费!好用!)

别信那些“要买商用库”的忽悠——
Bouncy Castle 是Java圈电子签章的老黄牛,开源免费,支持RSA/SHA256。
(官网:https://www.bouncycastle.org/)

怎么用?

  1. Maven加依赖(就两行):
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version> <!-- 别用旧版,坑多 -->
</dependency>
  1. 生成密钥对(私钥自己藏好,公钥发给客户):
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", "BC");
keyGen.initialize(2048); // 2048位够用
KeyPair keyPair = keyGen.generateKeyPair();

// 私钥存文件(生产环境别写死!)
Files.write(Paths.get("private.key"), keyPair.getPrivate().getEncoded());

三、签个章,就三步(代码超短)

场景:给“合同.pdf”签名,生成“合同_signed.pdf”

// 1. 读取文件内容(二进制)
byte[] fileBytes = Files.readAllBytes(Paths.get("合同.pdf"));

// 2. 用私钥签名(核心!)
Signature signature = Signature.getInstance("SHA256WithRSA", "BC");
signature.initSign(keyPair.getPrivate());
signature.update(fileBytes);
byte[] signedBytes = signature.sign();

// 3. 把签名结果和原文件合并(别直接覆盖!)
Files.write(Paths.get("合同_signed.pdf"), 
    fileBytes, // 原文件
    signedBytes // 签名结果
);

💡 关键点

  • SHA256WithRSA:安全标准,别用MD5(早过时了)
  • signedBytes追加到文件末尾,不能覆盖(不然文件损坏)
  • 别在代码里写私钥!生产环境必须用密钥库(KeyStore)管理。

四、客户怎么验章?(别让签名变废纸)

客户拿到文件后,要验签(否则你签的章就是个PPT)。
验签代码(客户自己就能跑):

// 1. 读取签名文件
byte[] fileBytes = Files.readAllBytes(Paths.get("合同_signed.pdf"));
byte[] originalFile = Arrays.copyOf(fileBytes, fileBytes.length - signedBytes.length);
byte[] signatureBytes = Arrays.copyOfRange(fileBytes, fileBytes.length - signedBytes.length, fileBytes.length);

// 2. 用公钥验签
PublicKey publicKey = ... // 从客户发来的公钥文件读取
Signature sig = Signature.getInstance("SHA256WithRSA", "BC");
sig.initVerify(publicKey);
sig.update(originalFile);
boolean isVerified = sig.verify(signatureBytes);

System.out.println("验签结果: " + (isVerified ? "通过" : "失败!文件被篡改"));

⚠️ 血泪教训
我第一次没写验签,客户说“这章能改”,差点丢项目。
签名不验,等于没签!


五、避坑指南(我踩过的雷)

现象解决方案
证书过期签完客户说“章失效”KeyPairGenerator生成时,别设有效期(默认20年)
文件乱码签完打开是乱码签名结果必须转Base64(或二进制追加),别用new String(signedBytes)
私钥泄露有人伪造签名私钥存到KeyStore,别写死在代码里!(用KeyStore.load()
验签失败客户说“章不对”签名和验签必须用同一个算法(比如都用SHA256WithRSA

六、最后说句大实话

电子签章不是什么黑科技——
就是用Java的Signature类,加上Bouncy Castle库,再加个证书管理。
别被“高大上”忽悠,我用这方法给5个客户做系统,成本=0,客户还夸“太简单了”

现在就去试试

  1. 用上面代码生成个签名
  2. 用验签代码验一下
  3. 然后把文件发给朋友:“看,我的数字章!”

(写完这篇,我删了项目里最后1个第三方签章API——真香。)

记住:电子签章的核心不是技术,是别让客户觉得“这玩意儿太难”
你搞定了,客户就开心;你搞不定,客户就骂你。
所以,别犹豫,动手!

总资产 0
暂无其他文章

热门文章

暂无热门文章