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

如何用Java实现Microsoft Azure key vault的sha-1?

彭存
2023-03-14

我需要用Java实现一个带有Key Vault的符号,使用Sha1算法,但不被支持,如何实现呢,我尝试用bouncy castle做了de digest并用RSNULL算法使用Key Vault客户端,但结果是不正确的。

    String stringToSign = "holamund";
    byte[] digestSha1Bytes = DigestUtils.sha1(stringToSign.getBytes());
    keyOperationResult = keyVaultClient.sign("AZURE_URL_KEY",   JsonWebKeySignatureAlgorithm.RSNULL, digestSha1Bytes);

产生的输出:IOGXIIIZ5ZYM2M7OZZ/ET8UOWWTWMKESEJVVS9W9CPHZ11WKFZ/IKGX2SJ4ADHCN32QCDBOSV/KNATVPYW+EXKVX/3NRAMXUIUUUGHQF4/MUU7Y2644IWUECXQP8O1IXL8Mn7SCEB5SH0SNARK77DVFRK7A0UNZR/82WPFXMJXYYEH8K/CIFRHK/MWX6SZE+1RM6VDMKAODYRQR1LSUSSS0WZOIUVDTXNKYL55MATS5CLPWIPBHU+H4YAO1+B+NFVKJEEDDGBJHVMMO1EO/KT7HSHREOUKYR2MWKXKLZCZA3DWRP3PSI9RDIRPOC/IVFIOCWCYK44XFX0UKVHDZHZ4W==

预期输出:PhoyaoTuoTelMTBFGRPG12TJP0JDJQY1GSDMR63S8L8HMB4LSIRMALXSVRM5D2ED2D6PMDMXVA+OJUW/PXZX5RM5B3SEIIXDE5JLOOKOOC2PBKIGJI5SF7+YCSOWCSGTDXMWKTQDBCZWERHW1HS5HNJW/UBKBIMDF0RT478JXEPH9AYEHOFJANLLI5/OHZDUPS8PX9QZQIR/KYRWK32Z14DUGPCTYET5TTY7LYU4KSTEYCWEA5BOONAZAN8ENT41 S564CCPR2ZDYIRZCNNWLTQXD7InNPUFWP+RVLZHLYP3Y+IIYIU6EYJURDOTUHHZTP+MEQSD/IMTGE43FWB6W==

我试着用不同的API(如bouncy castle、java native等)做了消化,但没有用key vault符号来做正确的约定。

共有1个答案

叶智
2023-03-14

在Azure Key Vault中,rsnull算法提供了一个原始的rsa签名。为了使用原始RSA签名算法生成标准SHA1签名,您必须首先将摘要包装到要签名的ASN.1 DigestInfo结构中。以下示例显示:

import java.io.IOException;
import java.security.KeyPair;
import java.security.MessageDigest;
import java.security.Signature;
import com.microsoft.azure.keyvault.KeyVaultClient;
import com.microsoft.azure.keyvault.models.KeyBundle;
import com.microsoft.azure.keyvault.models.KeyOperationResult;
import com.microsoft.azure.keyvault.webkey.JsonWebKey;
import com.microsoft.azure.keyvault.webkey.JsonWebKeySignatureAlgorithm;

...

/**
 * @param keyVaultClient An instance of Key Vault client.
 * @param keyIdentifer The Key Identifier. This is the kid field of JsonWebKey structure.
 * @param message The message to be signed.
 */
void sampleSHA1SignatureWithAzureKeyVault(KeyVaultClient keyVaultClient, String keyIdentifer, byte[] message) throws Throwable {

    /////////////////////////////////////////
    // Signs message using Azure Key Vault //
    /////////////////////////////////////////

    // Compute SHA1 hash:
    MessageDigest md = MessageDigest.getInstance("SHA1");
    md.update(message);
    byte[] digest = md.digest();

    // Convert SHA1 digest into ASN.1:
    byte[] digestInfo = getDigestInfoForSHA1Digest(digest);

    // Call Azure Key Vault to perform the signature using the server key.
    // Note that we are passing the DigestInfo to RSNULL, instead of SHA1 digest.
    KeyOperationResult result = keyVaultClient.sign(keyIdentifer, JsonWebKeySignatureAlgorithm.RSNULL, digestInfo);
    byte[] signature = result.result();

    /////////////////////////////////////////////////////////
    // Verifies the signature locally, using java.security //
    /////////////////////////////////////////////////////////

    // Read the public key from Azure Key Vault
    KeyBundle keyBundle = keyVaultClient.getKey(keyIdentifer);

    // Initialize java.security instances with the Public Key and message.
    KeyPair kp = keyBundle.key().toRSA(false);
    Signature signImpl = Signature.getInstance("SHA1withRSA");
    signImpl.initVerify(kp.getPublic());
    signImpl.update(message);

    // Verify the signature.
    if (signImpl.verify(signature))
        System.out.println("Signature was verified.");
    else
        System.out.println("Signature verification failed.");
}

byte[] getDigestInfoForSHA1Digest(byte[] digest) {

    // Constructs an ASN.1 DigestInfo structure for the caller-specified SHA1 hash.

    // ASN.1 data:
    byte[] digestInfo = new byte[] { //
            0x30, 0x21, // SEQUENCE DigestInfo (33 bytes) (13 of header + 20 of SHA1 digest)
            0x30, 0x09, // SEQUENCE AlgorithmIdentifier (9 bytes)
            0x06, 0x05, // OBJECT IDENTIFIER algorithm (5 bytes)
            0x2b, 0x0e, 0x03, 0x02, 0x1a, // OID of SHA1 (1.3.14.3.2.26)
            0x05, 0x00, // NUL algorithm parameters (05 00 is the DER encoding for NUL)
            0x04, 0x14, // OCTET STRING digest (20 bytes)
            00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 // SHA1, copied below
    };

    System.arraycopy(digest, 0, digestInfo, 15, digest.length);

    return digestInfo;
}
 类似资料:
  • 本文向大家介绍Java实现SHA-1算法实例,包括了Java实现SHA-1算法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现SHA-1算法的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的java程序设计有所帮助。

  • 本文向大家介绍java中加密的实现方法(MD5,MD2,SHA),包括了java中加密的实现方法(MD5,MD2,SHA)的使用技巧和注意事项,需要的朋友参考一下 java中加密的实现方法(MD5,MD2,SHA)      实例代码:注释都很清楚, 输出结果:  以上就是java 加密的实例,如疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 问题内容: hashCode()如何实现? 我的假设是它将对象存储位置用作运行哈希函数的初始数字(种子)。然而,这种情况并非如此。 我还研究了Hash:它在内部如何工作?但它不能回答我的问题。 是的,我可以下载SDK,但是在执行此操作并查看代码之前,也许其他人已经知道了。 谢谢 :) 编辑: 我知道它应该被覆盖等等,所以请尝试保持话题:) 问题答案: 当然,它是特定于实现的,但是通常,对象的哈希码

  • 问题内容: 在纯Java6中为大型文件创建SHA-1的最佳方法是什么?如何实现此方法: 问题答案: 使用类并逐个提供数据。下面的示例忽略了诸如将byte []转换为字符串并关闭文件之类的细节,但是应该给了您大致的理解。

  • 本文向大家介绍JavaScript实现SHA-1加密算法的方法,包括了JavaScript实现SHA-1加密算法的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript实现SHA-1加密算法的方法。分享给大家供大家参考。具体实现方法如下: 调用方法:hex_sha1即可。 希望本文所述对大家的javascript程序设计有所帮助。

  • 问题内容: 我想实施一个。 我不想只使用,因为我必须实现大量的方法。 可以避免吗? 更具体的,我怎么能流,以及例如: 问题答案: JDK的标准实现是内部类,您不能直接实例化它。 相反,你可以使用,以及各种1,2种静态工厂方法来创建默认实现的实例。 使用分离器可能是最强大的方法,因为它可以让您懒惰地提供对象,同时如果您的源可以分为多个块,则还可以实现有效的并行化。 此外,如果需要实现自己的 有状态中