【问题标题】:Apache Nifi Processor for Signature Verification用于签名验证的 Apache Nifi 处理器
【发布时间】:2018-09-27 08:23:13
【问题描述】:

我开发了一个用于签名验证的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 可执行文件。”

【问题讨论】:

    标签: java maven apache-nifi


    【解决方案1】:

    这里是初学者的详细指南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 中使用它。

    【讨论】:

    • 我按照mkyong.com/maven/how-to-install-maven-in-windows 的描述安装了 maven,但是当我运行“mvn –version”时,我收到此错误:“您指定的目标需要执行一个项目,但此目录中没有 POM(C :\Users\KX5710)。请确认您从正确的目录调用了 Maven"
    • 您的 符号无效。它看起来像破折号,但应该是减号。你可以复制这个:“mvn -version”
    • @ Vitaliy Samofal 谢谢。我已阅读mkyong.com/maven/how-to-install-maven-in-windows 并执行了这些步骤,但我不明白第 2.7 节这个 IP 地址是什么?当我想连接到它以复制 nar 文件时出现超时错误。还有如何重启 nifi ?谢谢
    • 我不知道你在做什么 2.7 部分。关于重新启动,这取决于您如何安装它。我想,你只需下载它,然后运行 ​​.bat 文件。如果是,那么您可以参考此nifi.apache.org/docs/nifi-docs/html/…。只需单击 ctrl+c,然后再次运行 .bar。
    • 我说的是这一段: 2.7Copy the nar file to Nifi "Copy the nar file to the bin directory of where nifi is installed 这里是一个复制文件的示例命令——scp nifi- demo-nar-1.0.nar root@172.16.149.157:/opt/nifi-1.0.0.0-7/bin/ 复制 nar 文件后,您需要重新启动 nifi 重新启动后,您应该能够添加自定义处理器构建后将显示名称为“MyProcessor”“community.hortonworks.com/articles/4318/…
    【解决方案2】:

    很高兴您在 NiFi 上编写自己的自定义处理器。您必须牢记以下几点:

    • 您的处理器打算执行的核心功能位于被覆盖的 onTrigger 方法中。
    • 处理处理器的关系(失败/成功)

    对您的探索有帮助的指南:

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

    【讨论】:

    • 当我想在 cmd 中运行 .bat 文件时,即 run-nifi.bat 我收到此错误:“未正确定义 JAVA_HOME 环境变量。而是使用 PATH 查找 java 可执行文件。”谢谢你的帮助,我在localhost:8080/nifi找不到我的处理器
    • 如果您重命名了您的处理器,您是否在/src/main/resources/META-INF/services/org.apache.nifi.processor.Processor 中进行了相同的更新?
    • 这是处理器文件的内容:“scc.processors.demo.MyProcessor”我没有改变它。但为什么我会收到“JAVA_HOME 环境变量”错误?
    • 您的系统环境变量中是否设置了JAVA_HOME?否则可以指向nifi-env.bat中的Java安装目录
    • 是的,我做到了。我第一次运行 .bat 文件时没有收到此错误,但第二次 ....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多