JAVA-电子签名范例代码

代码

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.SignatureException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * ECDSA 160bit 签名及签名验证例子
 */
public class ECDSASignature {

    public static void main(String argv[]) {
        signatureTest();
    }

    public static void signatureTest() {

        /**
         * 密钥对生成
         */
        KeyPairGenerator keyPairGenerator = null;
        try {
            keyPairGenerator = KeyPairGenerator.getInstance("EC");
        } catch (NoSuchAlgorithmException ex) {
            return;
        }
        SecureRandom secureRandom = new SecureRandom();
        keyPairGenerator.initialize(160, secureRandom);
        KeyPair pair = keyPairGenerator.generateKeyPair();
        Key publicKey = pair.getPublic();
        Key privateKey = pair.getPrivate();

        // 字符串
        String hako = "test";

        /**
         * 私钥签名(ECDSA 160bit)
         */
        byte[] sign = null;
        try {
            Signature signatureSign = null;
            signatureSign = Signature.getInstance("NONEwithECDSA");
            signatureSign.initSign((PrivateKey) privateKey, secureRandom);
            signatureSign.update(hako.getBytes());
            sign = signatureSign.sign();

            System.out.println("sign: " + new String(sign));

        } catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException ex) {
            Logger.getLogger(ECDSASignature.class.getName()).log(Level.SEVERE, null, ex);
        }

        /**
         * 用公钥进行签名验证
         */
        Signature signatureVerify = null;
        try {
            signatureVerify = Signature.getInstance("NONEwithECDSA");
            signatureVerify.initVerify((PublicKey) publicKey);
            signatureVerify.update(hako.getBytes());
            boolean verifyResult = signatureVerify.verify(sign);
            System.out.println(verifyResult ? "签名OK" : "签名NG");

        } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
            Logger.getLogger(ECDSASignature.class.getName()).log(Level.SEVERE, null, e);
        }

    }

}

运行结果

sign: *************
签名OK

用p5.js制作烟花特效

前言

之前看过一篇文章,使用processing制作烟花特效。效果如下
fireworks

网上调查了一圈了,发现processing是一个互动编程软件,java语言发展而来。而且动画效果是跑在processing专门的模拟器上。
不过好在也有对应的web扩展语言,有processing.js和p5.js。
processing.js在github上已经好几年没有人维护了,一些processing的特性支持不了。为此踩了不少坑,
本文就集中讲解如何用p5.js写烟花特效。

Continue reading

ubuntu(16.04)启动时间分析与apt-daily.service优化

启动时间查询

mingfeng@thinking:~$ systemd-analyze
Startup finished in 8.199s (kernel) + 7.865s (userspace) = 16.064s

各启动项消费的时间查询

mingfeng@thinking:~$ systemd-analyze blame 
          6.196s NetworkManager-wait-online.service
          1.069s mysql.service
          1.015s dev-sda2.device
           331ms apparmor.service
           301ms php7.0-fpm.service
           280ms accounts-daemon.service
           253ms ModemManager.service
           253ms systemd-udevd.service
           227ms networking.service
           207ms systemd-logind.service
           198ms console-setup.service
           192ms lightdm.service
           180ms systemd-cryptsetup@cryptswap1.service
...

Continue reading

JUPITER+PYTHON+SELENIUM(UBUNTU)

前言

jupiter是一款开源软件。可以借助jupiter通过web进行编写python, nodejs等语言及调试。
说得有点官方了。通常我们更关心,它能用来做什么?
那我们就来说说场景吧。

  • 场景1
    作者所属的公司团队里,赶时髦也在推进测试的自动化。但团队里的测试人员的编码水平还有待提升。如何迅速地推进自动化测试在业务项目中落地是一个重大课题。
    首先我们明确下需求。需求是什么? 测试人员编写自动化测试代码!!!
    测试人员需要关心IDE安装? 不需要
    测试人员需要很高深的编码技巧? 只是自动化测试的话,够用就行! 如果测试代码写得比业务代码还复杂,那可能南辕北辙了。
    测试人员可能需要开发帮助定位问题或修改测试代码? 开发可能要跑到测试的工位上或测试抱着电脑找开发,想想都觉得low了。
  • 场景2
    像作者这种python半吊子,还停留在看懂借助手册才能写代码阶段(其实是伪/复制代码)的程序员。只是单纯地跑下程序片段观察效果的,用jupiter就刚好合适。

Continue reading