当前位置: 首页 > 知识库问答 >
问题:

无法在JAVA中验证签名,但在.NET中验证成功

殷耀
2023-03-14

我们的旧系统使用.NET 3.5(运行在Windows Server 2003 32bits上)来验证来自我们客户的电子收据(都使用SHA1RSA算法作为协议)。我们将他们的证书以Base64字符串存储在数据库中。旧代码如下所示:

//Store certificates
String certificateEncodeBase64 = Convert.ToBase64String(byteArrayCertificateFile);

//Verify signatures

//Hash algorithm SHA-1
HashAlgorithm hashAlgrothm = new SHA1Managed();
//Data
byte[] data = System.Text.Encoding.UTF8.GetBytes(request.DataInUTF8);
//Signature
byte[] signature = Convert.FromBase64String(request.SignatureInBase64);
//Certificate
X509Certificate2 certificate = new X509Certificate2(Convert.FromBase64String(certEncodeBase64));
//Verify using algorithm RSA
RSACryptoServiceProvider pubKey = (RSACryptoServiceProvider)certificate.PublicKey.Key    
bool vr = pubKey.VerifyData(data, hashAlgrothm, signature);

除了性能不好外,没有其他问题。这就是为什么我们想要转移到使用Java1.7的新系统(运行在Windows Server 2012 64位上)。我们的新代码如下所示:

//Using the same DB store certificates

//Verify signatures using Bouncy Castle JCE Provider

//Hash data using SHA-1
byte[] data_ = request.getDataInUTF8().getBytes("UTF-8");
MessageDigest messageDigest_ = MessageDigest.getInstance("SHA-1", "BC");
byte[] hashed = messageDigest.digest(data);
//Signature
byte [] signature = new BASE64Decoder().decodeBuffer(request.getSignatureInBase64());
//Certificate
CertificateFactory certificateFactory = CertificateFactory.getInstance("X509", "BC");
byte[] buffer = new BASE64Decoder().decodeBuffer(certEncodeBase64);
ByteArrayInputStream byteArrayCertificateInputStream = new ByteArrayInputStream(buffer);
Certificate certificate = certificateFactory.generateCertificate(byteArrayCertificateInputStream);
//Verify using algorithm RSA
Signature verifyEngine = Signature.getInstance("RSA", "BC");
verifyEngine.initVerify(certificate);
verifyEngine.update(hashed);
result = verifyEngine.verify(signature);

我们遇到了这样一个问题:在我们的测试中,使用的是从旧系统中获取的所有验证数据,新系统验证了一些客户的数据,但一些客户总是返回失败。对于一个失败的示例

Base64中的证书

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

罗达塔

<HEADER><VERSION>1.0</VERSION><SENDER_CODE>TTSP_ICB</SENDER_CODE><SENDER_NAME>He Thong Thanh toan song phuong cua Ngan hang Vietinbank</SENDER_NAME><RECEIVER_CODE>TTSP_KBA</RECEIVER_CODE><RECEIVER_NAME>He thong Thanh toan song phuong cua Kho bac Nha nuoc</RECEIVER_NAME><TRAN_CODE>103</TRAN_CODE><MSG_ID>TTSP_ICB103004203763</MSG_ID><MSG_REFID /><SEND_DATE>04-03-2014 09:03:15</SEND_DATE><ORIGINAL_CODE>TTSP_ICB</ORIGINAL_CODE><ORIGINAL_NAME>He Thong Thanh toan song phuong cua Ngan hang Vietinbank</ORIGINAL_NAME><ORIGINAL_DATE>04-03-2014 09:03:15</ORIGINAL_DATE><ERROR_CODE /><ERROR_DESC /><SPARE1 /><SPARE2 /><SPARE3 /></HEADER><BODY><MT_ID>1420110300335833</MT_ID><SEND_BANK>89201001</SEND_BANK><RECEIVE_BANK>89701002</RECEIVE_BANK><CREATED_DATE>04-03-2014 09:26:24</CREATED_DATE><CREATOR>DD740063</CREATOR><MANAGER>DD740096</MANAGER><VERIFIED_DATE>04-03-2014 09:29:41</VERIFIED_DATE><F20>1474010300001334</F20><F23B>CRED</F23B><F26T>C</F26T><F32AS1>04-03-2014</F32AS1><F32AS2>VND</F32AS2><F32AS3>324000000.00</F32AS3><F33BS1>VND</F33BS1><F33BS2>324000000.00</F33BS2><F36 /><F50P1>VND101101001</F50P1><F50AP2 /><F50KP2>HUYNH THI KIM THOA</F50KP2><F51AP1S1 /><F51AP1S2 /><F51AP2 /><F52P1S1 /><F52P1S2 /><F52AP2>89201001</F52AP2><F52DP2>89201001</F52DP2><F53P1S1 /><F53P1S2 /><F53AP2 /><F53BP2 /><F53DP2 /><F54P1S1 /><F54P1S2 /><F54AP2 /><F54BP2 /><F54DP2 /><F55P1S1 /><F55P1S2 /><F55AP2 /><F55BP2 /><F55DP2 /><F56P1S1 /><F56P1S2 /><F56AP2 /><F56CP2 /><F56DP2 /><F57P1S1>C</F57P1S1><F57P1S2 /><F57AP2>89701002</F57AP2><F57BP2 /><F57CP2 /><F57DP2>KBNN PHU TAN - AN GIANG</F57DP2><F59P1>372301048091</F59P1><F59AP2 /><F59P2>UBND XA BINH THANH DONG#####</F59P2><F70 /><F71A>SHA</F71A><F71GS1 /><F71GS2 /><F72>UBND XA BINH THANH DONG NOP TIEN XE CHUYEN BENH</F72><F77B /><F77TS1 /><F77TS2 /><F77TS3 /><F77TS4 /><F77TS5 /><F77TS6 /><F77TS7 /><F77TS8 /><F77TS9 /><F77TS10 /><F77TS11 /><F77TS12 /><F77TS13 /><F77TS14 /><F77TS15 /><F77TS16 /><F77TS17 /><F77TS18 /><F77TS20 /><F77TS19 /></BODY>
KLpuojRk329lb++8CFKTFADh+3c=
KWMVPKpQ8Pg3fUij9pND/me3orlplkbdNLWcH5rztMhIz0BjTN8CJJHiFrN1w1Qkih0lSl24zDE5nbYw/vo+EG3tSJzC+d/h7wkm6ad9LHt5Y0cxYRIKWSHJRbCjkOXcO/eE3KZaAZONGEVWt1bLkL3zERN11RAyZjFEzrGE7WbiLvp/51Cy5zBU/mLJts3waiEpqycjOOVNo59ICulwclhcPR+gVzcwh65oxBelI+XRbRN1PfEw5J48R6fTwmdtRzD+OJejMLHmiHUBErRNo+XG7Q5ovwY1AG2GfCOCYIOu2jYd5DD9ZDuLEMa54Uz7cy3UbciXG5/n+7GtLfGeHA==
try
{
    sig = cipher.processBlock(sigBytes, 0, sigBytes.length);

    expected = derEncode(hash);
}
catch (Exception e)
{
    return false;
}
[48, 33, 48, 9, 6, 5, 43, 14, 3, 2, 26, 5, 0, 4, 20, 40, -70, 110, -94, 52, 100, -33, 111, 101, 111, -17, -68, 8, 82, -109, 20, 0, -31, -5, 119]
[40, -70, 110, -94, 52, 100, -33, 111, 101, 111, -17, -68, 8, 82, -109, 20, 0, -31, -5, 119]

此调试显示sig包括预期位(最后20个字节)。

我不知道怎么了。请救命!!!谢谢你。

共有1个答案

池恩
2023-03-14

我不认为你使用了正确的签名算法。文档建议您可能应该使用sha1withrsa作为签名算法。签名vs.expected进一步表明了这一点。您给出的“预期”值是原始SHA-1散列,而您提供的签名是PKCS#1 V1.5的DigestInfo(参见RFC2313,第10.1.2节)。

 类似资料:
  • 最近我需要在Java中使用RSA对一个字符串进行签名,并在C++中验证签名。 在Java,现在我认为一切都是好的,我创建了public.keystore和private.keysore,可以成功地对数据进行签名和veify。但是当我试图用C++验证它时,它显示签名失败。 这是我的Java代码,在Java,我将数据签名到base64String,并将其保存在我的本地文件中,保存为“sig.dat”,

  • 我有一个使用C++中的openSSL生成的keypair,我正在使用它在一个严格使用RSACryptoServiceProvider(没有BouncyCastle等)的C#服务器上对验证消息进行签名。我使用PKCS#1 SHA256生成签名,然后以十六进制的形式与公钥一起传输签名。问题是无法在服务器上验证签名。我已经尝试删除了头,上面写着“----开始RSA公钥-----”等等。但是还没有结果。生

  • 但是,当我收到SignatureMethod RSA-SHA512(http://www.w3.org/2001/04/xmldsig-more#RSA-SHA512)时,CheckSignature()会出现CryptograhicException中断:无法为提供的签名算法创建SignatureDescription。 看起来CheckSignature()无法验证RSA-SHA512签名。

  • 情况是我必须检查一个数字签名: 字符串1“A1005056807CE11EE2B4CE0025305725CFRCN=KED,OU=I0020266601,OU=SAPWebAS,O=SAPTrustCommunity,C=DE20130611102236”通过PKCS#7签名并通过HTTP-URL发送给我。 我在BASE64中获得签名的内容(在代码字符串sc中查找)。 现在我必须检查,如果Str

  • 我们有一个无服务器后端,它由API网关中的IAM保护。我们有另一个内部身份验证解决方案,我们希望在我们的服务中支持这两种身份验证机制。我计划编写一个自定义授权程序,带有支持多重身份验证的身份验证链。 但是,我找不到任何方法在后端验证AWS Sigv4签名。我发现AWS文档关于如何签署请求或计算Sigv4签名([1],[2],[3]和[4]),但是所有这些文档都是从客户端的角度来看的,客户端将可以访

  • 问题内容: 我试图让Java验证签名的SHA-1哈希,但是它一直返回false。我在Go中有以下代码,该代码生成RSA密钥对并签名并返回击中/ sign端点的任何消息,以及十六进制编码的哈希,公钥模数和指数: 在Java / Android方面,我有以下代码,该代码在发送相关位后会使用未解析的JSON对象击中此函数,但是一旦到达签名验证部分,它始终会返回false: 问题答案: 在Java中,您无