首页 文章

在apache nifi中使用公钥进行RSA数字签名验证

提问于
浏览
0

大家好,

我有一个要求,期望客户端应用程序通过我们提供的其余api endpoints 发送数据 . 期望客户端应用程序将数据作为查询参数发送 .

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

连同实际数据的所有元素/列(结果,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处理器,但我得到的哈希值非常小,并且它不是基于客户端提供的公钥派生的 .

我也尝试使用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管道中调用它的想法?

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

感谢任何帮助 .

谢谢,

Vish

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

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

  • pub.key文件位置

来自客户端的hexdump的

  • 签名值

  • 生成签名的关键列的实际连接字段 .

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

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中调用它?以及如何将流文件属性作为参数传递给脚本(执行脚本处理器)?如何将验证状态消息作为流文件中的附加属性?

任何帮助是极大的赞赏 .

谢谢,

Vish

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

1 回答

  • 0

    你可以通过几种方式实现这一目标 . 由于您已经有一系列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 .

相关问题