【发布时间】:2018-07-13 05:28:24
【问题描述】:
大家好,
我有一个要求,客户端应用程序应该通过我们提供的 rest api 端点发送数据。客户端应用程序应将数据作为查询参数发送。
除了实际数据的所有元素/列(结果、属性 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 脚本
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 中调用它?以及如何将流文件属性作为参数传递给脚本(执行脚本处理器)?以及如何将验证状态消息作为流文件中的附加属性获取?
非常感谢任何帮助。
谢谢,
维什
================================================ ==============
【问题讨论】:
标签: python openssl apache-nifi