2009-09-04 13 views
7

Javaでバイト配列のハッシュを計算しようとしています。 MessageDigestのインスタンスを取得するには、ハッシュ名を通知する必要がありますが、ハッシュOIDしかありません。ハッシュOIDからハッシュ名にこれを行う別の方法や既存のマップがありますか?JavaでOIDを使用してハッシュアルゴリズム名を取得するにはどうすればよいですか?

String oid = "1.2.3.4.5"; 
String digestAlgorithmName = getDigestAlgorithmName(oid); 

MessageDigest messageDigest = MessageDigest.getInstance(digestAlgorithmName); 
byte[] actualHash = messageDigest.digest(new byte[] { 0x00 }); 
+0

どのような種類のOIDですか? ASN.1?これらのOIDを誰が担当していますか? – Dirk

+0

これはASN.1 OIDです。これらのOIDは標準化されたものです。 –

答えて

1

回答が見つかりました。 Bouncy Castle Libraryのorg.bouncycastle.cms.CMSSignedHelperクラスにはマッピングがあります。そこから必要なスニペットを抽出してここにコピーしました。

... 
private static final Map  encryptionAlgs = new HashMap(); 
private static final Map  digestAlgs = new HashMap(); 

static 
{ 
    encryptionAlgs.put(X9ObjectIdentifiers.id_dsa_with_sha1.getId(), "DSA"); 
    encryptionAlgs.put(X9ObjectIdentifiers.id_dsa.getId(), "DSA"); 
    encryptionAlgs.put(OIWObjectIdentifiers.dsaWithSHA1.getId(), "DSA"); 
    encryptionAlgs.put(PKCSObjectIdentifiers.rsaEncryption.getId(), "RSA"); 
    encryptionAlgs.put(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), "RSA"); 
    encryptionAlgs.put(TeleTrusTObjectIdentifiers.teleTrusTRSAsignatureAlgorithm, "RSA"); 
    encryptionAlgs.put(X509ObjectIdentifiers.id_ea_rsa.getId(), "RSA"); 
    encryptionAlgs.put(CMSSignedDataGenerator.ENCRYPTION_ECDSA, "ECDSA"); 
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA2.getId(), "ECDSA"); 
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA224.getId(), "ECDSA"); 
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA256.getId(), "ECDSA"); 
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA384.getId(), "ECDSA"); 
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA512.getId(), "ECDSA"); 
    encryptionAlgs.put(CMSSignedDataGenerator.ENCRYPTION_RSA_PSS, "RSAandMGF1"); 
    encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3410_94.getId(), "GOST3410"); 
    encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3410_2001.getId(), "ECGOST3410"); 
    encryptionAlgs.put("1.3.6.1.4.1.5849.1.6.2", "ECGOST3410"); 
    encryptionAlgs.put("1.3.6.1.4.1.5849.1.1.5", "GOST3410"); 

    digestAlgs.put(PKCSObjectIdentifiers.md5.getId(), "MD5"); 
    digestAlgs.put(OIWObjectIdentifiers.idSHA1.getId(), "SHA1"); 
    digestAlgs.put(NISTObjectIdentifiers.id_sha224.getId(), "SHA224"); 
    digestAlgs.put(NISTObjectIdentifiers.id_sha256.getId(), "SHA256"); 
    digestAlgs.put(NISTObjectIdentifiers.id_sha384.getId(), "SHA384"); 
    digestAlgs.put(NISTObjectIdentifiers.id_sha512.getId(), "SHA512"); 
    digestAlgs.put(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), "SHA1"); 
    digestAlgs.put(PKCSObjectIdentifiers.sha224WithRSAEncryption.getId(), "SHA224"); 
    digestAlgs.put(PKCSObjectIdentifiers.sha256WithRSAEncryption.getId(), "SHA256"); 
    digestAlgs.put(PKCSObjectIdentifiers.sha384WithRSAEncryption.getId(), "SHA384"); 
    digestAlgs.put(PKCSObjectIdentifiers.sha512WithRSAEncryption.getId(), "SHA512"); 
    digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd128.getId(), "RIPEMD128"); 
    digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd160.getId(), "RIPEMD160"); 
    digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd256.getId(), "RIPEMD256"); 
    digestAlgs.put(CryptoProObjectIdentifiers.gostR3411.getId(), "GOST3411"); 
    digestAlgs.put("1.3.6.1.4.1.5849.1.2.1", "GOST3411"); 
} 

String getDigestAlgName(String digestAlgOID) { 
    String algName = (String)digestAlgs.get(digestAlgOID); 

    if (algName != null) 
    { 
     return algName; 
    } 

    return digestAlgOID; 
} 

String getEncryptionAlgName(String encryptionAlgOID) { 
    String algName = (String)encryptionAlgs.get(encryptionAlgOID); 

    if (algName != null) 
    { 
     return algName; 
    } 

    return encryptionAlgOID; 
} 

MessageDigest getDigestInstance(String algorithm, String provider) 
    throws NoSuchProviderException, NoSuchAlgorithmException { 
    if (provider != null) 
    { 
     try 
     { 
      return MessageDigest.getInstance(algorithm, provider); 
     } 
     catch (NoSuchAlgorithmException e) 
     { 
      return MessageDigest.getInstance(algorithm); // try rolling back 
     } 
    } 
    else 
    { 
     return MessageDigest.getInstance(algorithm); 
    } 
} 
1

クラスorg.bouncycastle.cms.CMSSignedGeneratorには、サポートされるアルゴリズムごとに定数があります。その定数は公開されているので、パッケージのみアクセス可能なCMSSignedHelperよりも使いやすいです。

3

ほとんどのセキュリティプロバイダ(およびBouncyCastleもその1つ)は、単一のアルゴリズム名だけでなく、OIDを含むエイリアスも定義します。したがって、それはこのようにJCAに直接OID渡すことが可能です:

String oid = "1.3.14.3.2.26"; 
MessageDigest md = MessageDigest.getInstance(
    oid, BouncyCastleProvider.PROVIDER_NAME); 
String digestAlgorithmName = md.getAlgorithm(); 

digestAlgorithmName

が最後に SHA-1に等しくなります。これはSUNセキュリティプロバイダでは機能しません。

+1

残念ながら、JCEはまた、(少なくとも1.8で)OID別名をサポートしていない 'のgetAlgorithm()は' OIDを返します:) –

+0

これはJDK 1.7 – saurav

+0

では動作しませんが、はい、SUNプロバイダは、アルゴリズムのために指定された別名を持って、アルゴリズム名は正しく解決されません。したがって、BouncyCastleが 'MessageDigest'を実装するためには、セキュリティプロバイダの明示的な名前を使用する必要があります。 – divanov