• OFD板式文件创建JAVA工具-EASYOFD 七、 电子签章及验签 Seal


         JAVA版本的OFD板式文件创建工具easyofd.
         功能包含了图像、 图像、 文字、和模版页功能。同时也支持OFD文件的数字签名及验签,电子签章及验签。
         本JAVA版本的easyofd使用原生方式创建板式文件,不依赖JAVA的SWT库。

         项目地址:http://wiki.easyofd.cn/zh/JAVA
         浏览器查看OFD文件控件地址: http://www.easyofd.cn

         代码地址:https://github.com/11627685/easyofd-java

    一、电子印章

    1.1 使用easyofd制作电子印章

      这属于测试性质的电子印章。正式环境应是政府颁发的电子印章。
      制作电子印章主要包含以下几个步骤:

    1. 制作数字证书
    2. 获取印章图片
    3. 补充签章位置等其他属性
    4. 保存电子印章
        代码如下:
    1. //第一步 创建电子印章证书
    2. GMX509Builder gmx509Builder= null;
    3. try {
    4. gmx509Builder = getCertificate();
    5. } catch (Exception e) {
    6. e.printStackTrace();
    7. }
    8. X509Certificate certificate= gmx509Builder.getCertificate();
    9. System.out.println(certificate.toString());
    10. BCECPrivateKey bcecPrivateKey=(BCECPrivateKey) gmx509Builder.getPrivateKey() ;
    11. //第二步 电子印章的图片
    12. File file = new File("image/123.png");
    13. byte[] picdata= Util.getFileBytes(file);
    14. DEROctetString data= new DEROctetString (picdata);
    15. DEROctetString cert= new DEROctetString (certificate.getEncoded());
    16. //第三步 补充签章位置等其他属性
    17. SESeal seSeal= SealBuilder.getInstance("00001",5,"easyOFD电子印章",bcecPrivateKey,
    18. "png",data,40,30,null,cert
    19. );
    20. //第四步 保存电子印章
    21. String filePath1 = "XML/seal/seal-out.esl";
    22. SaveSealFile(filePath1,seSeal);
    23. //第五步 保存秘钥
    24. String filePath2 = "XML/seal/seal-key.esl";
    25. SaveSealKeyFile(filePath2,bcecPrivateKey);

    Copy

    二、电子签章

    1. //第一步 获取电子印章证书
    2. String sealPath = "XML/seal/seal-out.esl";
    3. SESeal seSeal=Util.getSealFromFile(sealPath);
    4. //第二步 获取私钥文件
    5. String keyPath = "XML/seal/seal-key.esl";
    6. BCECPrivateKey bcecPrivateKey=(BCECPrivateKey) getPrivateKey(keyPath) ;
    7. //第三分 对签名范围内文件进行电子签章
    8. String filePath1 = "XML/image/image.ofd";
    9. String filePath2 = "XML/seal/image-seal.ofd";
    10. CTBoundary ctBoundary=new CTBoundary(10,10,40,30);
    11. OFDSealFile ofdSealFile=new OFDSealFile( new File(filePath1),seSeal);
    12. try {
    13. ofdSealFile.seal(bcecPrivateKey,ctBoundary);
    14. try {
    15. OutputStream os = null;
    16. os = new FileOutputStream(filePath2);
    17. ofdSealFile.saveOFD(os);
    18. if(os!=null)
    19. {
    20. os.flush();
    21. os.close();
    22. }
    23. } catch (Exception e) {
    24. e.printStackTrace();
    25. }
    26. } catch (JAXBException e) {
    27. e.printStackTrace();
    28. }

    Copy

    三、电子签章验证

      验签是很简单的过程,只要把需要验签的文件传递给OFDVerifySignature类,调用verifySignature方法即可,只有该方法返回是true的情况才属于验签通过。

    目前该版本程序验签只负责核对签名文件是否被修改进行验证,不会对证书的有效性,证书链,是否被吊销,是否过期等进行检核。

    1. // 对OFD文件签章验证
    2. public void VerFapiaoSeal() throws IOException, CryptoException, CertificateEncodingException, NoSuchProviderException, InvalidKeySpecException {
    3. boolean sucessed=false;
    4. try {
    5. String filePath = "XML/seal/fapiao.ofd"; // ASN.1文件路径
    6. Security.addProvider(new BouncyCastleProvider());
    7. OFDVerifySignature ofdVerifySignature =new OFDVerifySignature(new File(filePath));
    8. ofdVerifySignature.setSealCheck(this::sealCheck);
    9. boolean verifySignature = ofdVerifySignature.verifySignature();
    10. System.out.println("aaaaaa:"+verifySignature);
    11. }catch (Exception ex) {
    12. Assert.fail(ex.getMessage());
    13. }
    14. sucessed=true;
    15. assertEquals(true,sucessed ) ;
    16. }
    17. //你自己的签章验证程序
    18. @Override
    19. public boolean sealCheck(SES_Signature sesSignature) {
    20. System.out.println("your seal check");
    21. return true;
    22. }

    Copy

    不过你可以实现ISealCheck接口来定义你自己的检核程序。SES_Signature,包含了签名的值详细内容见 电子签章技术规范 GB/T 38540

    四、easyofd电子签章后效果

    seal-1.png

    seal-2.png

    seal-3.png

    seal-4.png

    seal-5.png

  • 相关阅读:
    【screen】screen命令 使用小记
    算法通过村第十四关-堆|黄金笔记|中位数
    操作系统——文件管理の选择题整理
    vue3+vite+ts 发布自定义组件到npm
    没那么简单!浅析伦敦金与美元的关系
    ES父子级关系Join类型的使用
    C++ Qt关于启动可执行文件存在的问题
    acwing算法基础之基础算法--区间合并算法
    C语言 static extern 关键字详解
    关于java String类(源码等)分析
  • 原文地址:https://blog.csdn.net/likewindy/article/details/141096903