【问题标题】:RSA Digital signature verification using public key in apache nifi在apache nifi中使用公钥进行RSA数字签名验证
【发布时间】:2018-07-13 05:28:24
【问题描述】:

​大家好,

我有一个要求,客户端应用程序应该通过我们提供的 rest api 端点发送数据。客户端应用程序应将数据作为查询参数发送。

curl -L -X POST "http://endpointurl:port/data?result=PASS&c=ADD_RECORD&attribute1=test1&attribute2=test2&attribute3=test3&attribute4=test4&signature=62759010b083d8fcf6e7ec18e6582bc07789d6dda17efbff6f474635c63db6afcbb3a0c25cf0d4c5bb1ba0ab772124edb9ba064d1530c2848fc160546263c86a2ba0cc26dd0073bb6344a1abb7475bcb1cd9f1c2b6af750db043a3da807ca356ab2d0959719dfff28af16246ce242a71d9fc99e5c383edfa90f6426568e1b6e9f8510871e40a05f6debaa6d9eee72eb9f6e0691ec625b1b24bb49cb3840940e7f83a13cdc0022e4a8ac35866f9b74418dcbeb232962113ad765cce334f431108866753c767098c363f97c056fa5f377b04094436629e9ede71b3074766c5b7492e4d7d5f4f52af0bee1683af68bb70f3cda4fef78cf5f98ce8765fd5d0e12280"

除了实际数据的所有元素/列(结果、属性 1、属性 2、属性 3 和属性 4),客户端应用程序还将发送一个称为签名的附加参数,该参数是通过散列创建的,并使用客户端私钥基于关键参数(不是所有的查询参数)

签名:echo -n 'attribute1attribute3' | openssl sha1 -sign id_rsa -hex

客户端应用程序还为我们提供了公钥文件,以便我们在处理记录之前使用实际数据验证签名。

我在 HDP 上使用 apache nifi,流量低于高级别的。已使用其他一些处理器进行验证并允许其他 http 请求。

Handlehttprequest-->>AttributestoJson-->>RouteOnAttribute-->>JolttransformJSON-->>ReplaceText-->>PutKafka-->>HandlehttpResponse

基本上,我从发布的数据中提取所有 http.query.param 值,如果参数 C=ADD_RECORD,我将连接关键属性(attribute1、attribute3),这将是应该验证的实际数据签名值。

我尝试使用 SHA1 通过 hashcontent 处理器,但我得到的哈希值非常小,并且不是基于客户端提供的公钥派生的。

我还尝试使用 Crypto 包查看 python 脚本,但无法使用实际数据验证签名。最重要的是,我不确定如何在 nifi 中调用 python 脚本。

以下是我可以手动使用数据验证签名的命令

echo -n 'attribute1attribute3' | openssl sha1 -sign id_rsa -hex>signature.hex

xxd -r -p signature.hex > 签名.bin

echo -n 'attribute1attribute3'>keyattribute.txt

openssl dgst -sha1 -verify /tmp/test.pub -signature signature.bin keyattribute.txt 和 signature.bin 来验证数字签名。但在我的实际需求中,我会将所有这些数据作为查询参数获取.

在提供以下方面的见解时需要帮助。

Hashcontent可以用来根据public.key文件生成签名吗?如果是这样,我认为我们可以使用Routeonattribute来验证签名与实际值并采取必要的措施。

关于通过 python/Groovy/Jython 脚本实现这一点的任何指导以及如何在 Nifi 管道中调用它的想法?

是否有可能构建自定义处理器以满足此要求?

感谢您对此的任何帮助。

谢谢,

维什

===================================== 大家好,

除了我之前的查询,我终于可以启动并运行需要三个参数的 python 脚本

  1. pub.key 文件位置

  2. 来自客户端的 hexdump 的签名值

  3. 生成签名的关键列的实际串联字段。

并显示签名是匹配还是失败。

from __future__ import print_function, unicode_literals
import sys
import binascii
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
pubfile = sys.argv[1]
sig_hex = sys.argv[2]
data = sys.argv[3]
if not path.isfile(pubfile):
sys.stderr.write('public key file not found\n')
def verifier(pubkey, sig, data):
rsakey = RSA.importKey(key)
signer = PKCS1_v1_5.new(rsakey)
digest = SHA.new()
digest.update(data)
return signer.verify(digest, sig)

with open("pubfile", 'rb') as f: key = f.read()
sig = sig_hex.strip().decode('hex')

if verifier(key, sig, data):
print("Verified OK")
else:
print("Verification Failure")

现在需要知道如何在 nifi 中调用它?以及如何将流文件属性作为参数传递给脚本(执行脚本处理器)?以及如何将验证状态消息作为流文件中的附加属性获取?

非常感谢任何帮助。

谢谢,

维什

================================================ ==============

【问题讨论】:

    标签: python openssl apache-nifi


    【解决方案1】:

    您可以通过几种方式做到这一点。由于您已经有一系列工作的 shell 命令,您可以使用ExecuteStreamCommand 处理器执行一系列命令(或将它们包装在 shell 脚本中)并将传入的流文件内容流式传输到 STDIN 并将 STDOUT 流式传输到传出的流文件内容.

    如果您愿意,可以使用ExecuteScriptInvokeScriptedProcessor 来运行您编写的DSL 脚本。我建议改用 Groovy,因为它在当前的 Apache NiFi 版本中处理得更好。 Python(实际上是 Jython)要慢得多,而且 does not have access to native libraries

    最后,如果这是您在未来流程中需要的重复任务,您可以编写一个自定义处理器来执行此操作。网上有many guides for writing a custom processor

    【讨论】:

    • 非常感谢@Andy 的投入。任何指针来显示如何传递/使用 STDIN 和 STDOUT 来获取内容并将其发布到流文件?
    • 哈希内容处理器也不能用于获取哈希值吗?查看配置属性,我看到它支持 SHA1,但没有看到传递可用于构建哈希值的公钥的方法。我知道这个处理器被广泛用于识别重复。但不确定,生成的哈希是否不同?
    • STDIN 和 STDOUT 自动用作 shell 命令的输入/输出,因此您不需要做任何特殊的事情。编写shell命令以这种方式读/写,流文件将自动填充/被填充。至于HashContent,它可以计算一个SHA-1哈希,但验证签名不是它的职责。
    • 再次感谢@Andy 提供详细信息。我会尝试提供的选项。
    猜你喜欢
    • 2022-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多