用于签名验证的Apache Nifi处理器

时间:2018-04-17 11:30:05

标签: java xml apache maven apache-nifi

我已经开发了一个用于签名验证的JAVA应用程序,如下所示:

    package read_key_pck;

    import static java.nio.charset.StandardCharsets.UTF_8;
    import java.util.Scanner;

    import javax.xml.bind.DatatypeConverter;

    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.security.KeyFactory;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.Security;
    import java.security.Signature;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Base64;

    import org.bouncycastle.jce.provider.BouncyCastleProvider;

    public class Main {

    public final static String RESOURCES_DIR = "C:\\Users\\KX5710\\eclipse-workspace\\read_key\\src\\read_key_pck\\";

    public static boolean verify(String plainText, String signature, PublicKey publicKey) throws Exception {
        Signature publicSignature = Signature.getInstance("SHA256withRSA");
        publicSignature.initVerify(publicKey);
        publicSignature.update(plainText.getBytes(UTF_8));

        byte[] signatureBytes = DatatypeConverter.parseHexBinary(signature); 

        return publicSignature.verify(signatureBytes);
    }

    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider());

        PublicKey pub = null;
        KeyFactory factory = KeyFactory.getInstance("RSA", "BC");
        try {

            pub = generatePublicKey(factory, RESOURCES_DIR
                    + "rsa_2048_pub.pem");

        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        String encodedPublicKey = Base64.getEncoder().encodeToString(pub.getEncoded());
        System.out.println("publickey: " + encodedPublicKey);

        boolean isCorrect = verify("         4   5.00   1.80", "54c5645616a8567d605bd990df0456913420fb630860316cf29bf57e19ef3102933ac948e672a4e3dfa8b7e20cc9eb44520aa8d8dc69143a5bc718a17a1d3f2dfc0084f172dbda6dd38e411e75100136d95d46e3d563c3a0aed062c40c6d17a5038ef0ad681622245bd2332008b1edca693b3418df1f5f86f09a6585d4af7da0d2ab44f5ce1c7ec8eed51696697b2674a881868be7163eda7c6562d02bdf069fcd66d483e8b22c5c976d27c04ffe38e62800eec17f1786b2f2161fcf44b91ba85a4486edb48a5c5a2f58dc1fa3969917eadabd7af753947de4a7f03034de09adb3b1cacb77e21444eee2d90944037606f84d0aa99f4794e8df8a2d0fbfff55c7", pub);
        System.out.println("Signature verification: " + isCorrect);
    }

    private static PublicKey generatePublicKey(KeyFactory factory,
            String filename) throws InvalidKeySpecException,
            FileNotFoundException, IOException {
        PemFile pemFile = new PemFile(filename);
        byte[] content = pemFile.getPemObject().getContent();
        X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content);
        return factory.generatePublic(pubKeySpec);
    }
}

    package read_key_pck;

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;

    import org.bouncycastle.util.io.pem.PemObject;
    import org.bouncycastle.util.io.pem.PemReader;

    public class PemFile {

        private PemObject pemObject;

        public PemFile(String filename) throws FileNotFoundException, IOException {
            PemReader pemReader = new PemReader(new InputStreamReader(
                    new FileInputStream(filename)));
            try {
                this.pemObject = pemReader.readPemObject();
            } finally {
                pemReader.close();
            }
        }

        public PemObject getPemObject() {
            return pemObject;
        }
    }

现在我想为这个JAVA应用程序开发一个Apache Nifi处理器;我在这里有一个示例代码:

https://github.com/pcgrenier/nifi-examples

但是我不知道我必须修改这个示例代码的哪些部分,因为这是我第一次开发Apache Nifi处理器。

此外,当我想在cmd中运行.bat文件,即run-nifi.bat时,我收到此错误:

  

“未正确定义JAVA_HOME环境变量   PATH将用于查找java可执行文件。“

2 个答案:

答案 0 :(得分:2)

以下是初学者https://community.hortonworks.com/articles/4318/build-custom-nifi-processor.html的详细指南。 上述文章基于此视频https://www.youtube.com/watch?v=3ldmNFlelhw

简要说明:

  1. 您应该从NiFi maven原型之一创建新项目。
  2. 根据需要修改生成的处理器。
  3. 构建nar文件并将其放入NiFi。
  4. 在NiFi中使用它。

答案 1 :(得分:2)

很高兴您在NiFi上编写自己的自定义处理器。你必须记住几件事情:

  • 处理器打算执行的核心功能包含在重写的onTrigger方法中。
  • 处理处理器的关系(失败/成功)

一些有助于您完成任务的指南:

第一部分为您提供了有关常用术语和概述的概述。在NiFi处理器中广泛使用的注释和类形式的功能,并在Apache NiFi developer guide上提供相关链接。该教程本身应该能够让您开始实际实现,因为它具有代码和POM形式的示例。