Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python和Java/Scala之间插入RSA签名时遇到问题_Java_Python_Scala_Rsa_Digital Signature - Fatal编程技术网

在Python和Java/Scala之间插入RSA签名时遇到问题

在Python和Java/Scala之间插入RSA签名时遇到问题,java,python,scala,rsa,digital-signature,Java,Python,Scala,Rsa,Digital Signature,我正在用Python2编写一个带有pythoncryptoapi的客户机来对XML文件进行数字签名,我有一个用Scala编写的服务,该服务用于验证签名。我的Python代码如下所示: from Crypto.PublicKey import RSA from Crypto.Hash import SHA from os import urandom import logging ... ... 要生成密钥(密钥大小为2048): 和阅读的关键: self.__private_key = fp

我正在用Python2编写一个带有pythoncryptoapi的客户机来对XML文件进行数字签名,我有一个用Scala编写的服务,该服务用于验证签名。我的Python代码如下所示:

from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from os import urandom
import logging

...
...
要生成密钥(密钥大小为2048):

和阅读的关键:

self.__private_key = fpri.read()
self.__public_key = fpub.read()
self.__key = RSA.importKey(self.__private_key)
和数字签名

logging.debug('Data to sign: "%s"' % data)
digest = SHA.new(data.strip()).digest()
return str(self.__key.sign(digest, None)[0])
然后在Scala/Java中,我使用以下内容:

package com.example.security
import com.example.action.ActionRequest
import java.io.BufferedInputStream
import java.security.spec.X509EncodedKeySpec
import java.security.KeyFactory
import java.security.PublicKey
import java.security.Signature
import org.apache.log4j.Logger

class SignatureSecurityManageer extends SecurityManagerTrait {

    def loadPublicKey() : PublicKey = {
        val stream : BufferedInputStream = new BufferedInputStream(this.getClass().getResourceAsStream("/com/example/security/key.der"))
        var key = new Array[Byte](stream.available())
        stream.read(key)
        KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(key))
    }

    def securityFilter(req : ActionRequest) : Boolean = {

        var parts = req.data.split("\n\n")

        var log : Logger = Logger.getLogger(this.getClass());
        log.trace("Data \"%s\"".format(parts(0)))
        log.trace("Sig \"%s\"".format(parts(1)))

         var sg = Signature.getInstance("SHA1withRSA");
         sg.initVerify(loadPublicKey())
         sg.update(parts(0).trim().getBytes())
         sg.verify(parts(1).trim().getBytes())
    }
}
我将客户机生成的PEM公钥转换为二进制公钥,以便Java能够读取:

openssl rsa -in src/com/example/security/key.pub -inform PEM -out src/com/example/security/key.der -outform DER -pubin
在传输中,我用两行新行分隔XML和签名。我意识到尾随空格可能会出现问题,因此我在上面添加了这些条带/修剪,并检查日志,验证数据是否相同:

Python客户端:

2012-04-09 14:24:51,089: Data to sign: "<?xml version="1.0" ?><AgraData><package id="Local-Laptop" timestamp="1333945491074"><sensors><sensor id="SUMTEMP001" type="Temperature" units="C"><data>8</data></sensor><sensor id="SUMVOL001" type="Volume" units="l"><data>27</data></sensor><sensor id="SUMFLO001" type="FlowRate" units="l"><data>41.142</data></sensor></sensors></package></AgraData>"
2012-04-09 14:24:51089:要签名的数据:“82741.142”
Scala服务:

[2012-04-09 14:24:51,771] com.urbanalta.agrastore.security.SignatureSecurityManageer TRACE - Data "<?xml version="1.0" ?><AgraData><package id="Local-Laptop" timestamp="1333945491074"><sensors><sensor id="SUMTEMP001" type="Temperature" units="C"><data>8</data></sensor><sensor id="SUMVOL001" type="Volume" units="l"><data>27</data></sensor><sensor id="SUMFLO001" type="FlowRate" units="l"><data>41.142</data></sensor></sensors></package></AgraData>"
[2012-04-09 14:24:51771]com.urbanata.agrastore.security.signaturesecuritymanager跟踪-数据“82741.142”

但是在Scala服务中,当我尝试验证签名时,它返回false。我想在某些地方我没有指定正确的签名/密钥类型,但我不确定在哪里。

这可能是另一个例子,说明签名的不仅仅是摘要,还有算法标识符和摘要。

您能否首先确保签名字符串和正在验证的字符串完全相同?例如,您可以检查它们的SHA。可能是编码改变了一些字符。一些想法。。。(顺便说一句,我从未使用过Python)。(1) Python的SHA方法与Scala中的SHA1方法相同吗?看见(2) 检查Python方法是否在内部计算SHA1。尝试将
data.strip()
传递给
sign
方法,而不是摘要。
[2012-04-09 14:24:51,771] com.urbanalta.agrastore.security.SignatureSecurityManageer TRACE - Data "<?xml version="1.0" ?><AgraData><package id="Local-Laptop" timestamp="1333945491074"><sensors><sensor id="SUMTEMP001" type="Temperature" units="C"><data>8</data></sensor><sensor id="SUMVOL001" type="Volume" units="l"><data>27</data></sensor><sensor id="SUMFLO001" type="FlowRate" units="l"><data>41.142</data></sensor></sensors></package></AgraData>"