大家好,
我有一个要求客户端应用程序通过我们提供的其余api端点发送数据的要求。客户端应用程序应将数据作为查询参数发送。
连同实际数据的所有元素/列(结果,attribute1,attribute2,attribute3和attribute4),客户端应用程序还将发送一个称为签名的附加参数,该参数是通过散列并使用基于客户端私钥的签名创建的关键参数(并非所有查询参数)
签名: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处理器,但是我得到的hash值很小,并且它不是基于客户端提供的公钥派生的。
我还尝试使用Crypto软件包查看python脚本,但无法使用实际数据验证签名。除此之外,我不确定如何在nifi中调用python脚本。
下面是我可以手动使用以验证数据签名的命令
echo -n'attribute1attribute3'| openssl sha1 -sign id_rsa -hex> signature.hex
xxd -r -p signature.hex> signature.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脚本
pub.key文件位置
签名值
在其上生成签名的键列的实际连接字段。
并显示签名是匹配还是失败。
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中调用它?以及如何将流文件属性作为参数传递给脚本(执行脚本处理器)?以及如何在流文件中获取验证状态消息作为附加属性?
非常感谢您的帮助。
谢谢
愿望
================================================ ============
答案 0 :(得分:0)
您可以通过几种方式执行此操作。由于您已经有一系列有效的Shell命令,因此可以使用ExecuteStreamCommand
处理器执行一系列命令(或将它们包装在Shell脚本中),并将传入的流文件内容流式传输到STDIN并将STDOUT流式传输到传出的流文件内容。
如果愿意,可以使用ExecuteScript
或InvokeScriptedProcessor
运行您编写的DSL脚本。我建议切换到使用Groovy,因为在当前的Apache NiFi版本中它处理得更好。 Python(实际上是Jython)要慢得多,does not have access to native libraries。
最后,如果您需要在以后的流程中重复执行此任务,则可以编写一个自定义处理器来执行此操作。在线有many guides for writing a custom processor个可用。