0赞
赏
赞赏
更多好文
上个月客户突然甩来一句:“要加电子签章,明天交。”
我心想:不就是盖个章嘛,能有多难?
结果?
- 第一版:签完客户说“这章不认”(证书过期了)
- 第二版:签完文件乱码(忘了转Base64)
- 第三版:客户说“这签名能改?”(没验签!)
别慌,今天不讲法律,只教你怎么用Java把电子签章搞定。
重点:代码少到哭,坑我全踩过,你直接抄。
一、电子签章到底是个啥?(别被术语吓跑)
想象你给合同盖个数字钢印:
- 你用私钥“刻”个章(签名)
- 别人用公钥“验章”(验签)
- 一旦文件被改,章就变色——这玩意儿比物理章靠谱多了
✅ 真实场景:
我们公司做医疗系统,客户要求电子签章。
之前用第三方API,年费3万,还卡顿。
用Java自己搞,30行代码搞定,成本=0。
二、核心工具:Bouncy Castle(免费!好用!)
别信那些“要买商用库”的忽悠——
Bouncy Castle 是Java圈电子签章的老黄牛,开源免费,支持RSA/SHA256。
(官网:https://www.bouncycastle.org/)
怎么用?
- Maven加依赖(就两行):
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version> <!-- 别用旧版,坑多 -->
</dependency>
- 生成密钥对(私钥自己藏好,公钥发给客户):
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个第三方签章API——真香。)
记住:电子签章的核心不是技术,是别让客户觉得“这玩意儿太难”。
你搞定了,客户就开心;你搞不定,客户就骂你。
所以,别犹豫,动手!
