2013-02-17 3 views
4
try { 
     MessageDigest digest = MessageDigest.getInstance("SHA-512"); 
     byte[] output = digest.digest(password); 

     digest.update(salt); 
     digest.update(output); 
     return new BigInteger(1, digest.digest()); 
    } catch (NoSuchAlgorithmException e) { 
     throw new UnsupportedOperationException(e); 
    } 

Но я получил Exception in thread "main" java.security.NoSuchAlgorithmException: SHA_512 MessageDigest not available ошибкуSHA-512 не поддерживается Java?

+0

http://mustafacanturk.com/sha512-hashing-on-java/ –

+3

Сообщение об исключении не соответствует коду: 'SHA_512' против правильного значения в коде' SHA-512'. – laz

+0

Извините Моя ошибка Благодарности – user236501

ответ

11

Я бы сказал, что наиболее вероятным объяснением является то, что ваш код REAL имеет "SHA_512", а не "SHA-512". Конечно, это объясняет, почему в сообщении об исключении есть символ подчеркивания.

Другая возможность заключается в том, что у вас есть JVM с криптографическими алгоритмами «военной силы», снятыми из-за ограничений экспорта США. Тем не менее, я считаю, что это очень маловероятно ...

(И в самом деле, мое чтение this, что SHA-512 был включен во всех версиях по умолчанию «Sun» провайдер в любом случае.)

+0

Ни один AES-256 не включен в JDK по умолчанию - читайте https: // knowledge.safe.com/articles/395/enabling-aes256-in-the-java-runtime-environment-fo.html. – Xdg

2

MessageDigest класс является классом двигатель предназначен для обеспечения функциональность криптографически безопасных дайджестов сообщений, таких как SHA-1 или MD5. Криптографически безопасный дайджест сообщений принимает вход произвольного размера (массив байтов) и генерирует выходной сигнал фиксированного размера .

Reference

Чтобы напечатать все MessageDigest поставщика -

Provider provider[] = Security.getProviders(); 
for (Provider pro : provider) { 
    System.out.println(pro); 
    for (Enumeration e = pro.keys(); e.hasMoreElements();) 
     System.out.println("\t" + e.nextElement()); 

} 

И Fortunatly SHA-512 есть, но SHA_512 нет. :)

13

Ниже приведены standard hashing algorithms обеспечивается Java MessageDigest:

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • ША -512

Возможно, вы захотите проверить имя, которое вы отправляете на заводский метод.

+0

Является ли Java поддержкой SHA3? – user236501

+0

Не обращайте внимания на мой предыдущий комментарий.По умолчанию Java не поставляется с поставщиком SHA3 MessageDigest. Но похоже, что [BouncyCastle] (http://www.bouncycastle.org/releasenotes.html) включил его в свою библиотеку. – Perception

+0

Обратите внимание, что реализация SHA-384 работает путем обрезания результатов из SHA-512. Следовательно, для этого потребуется такой же подсчет, как SHA-512. – Corne

7

Здесь способ выборки, который может быть использован, чтобы получить хэш строки через SHA-512:

private static String getHashCodeFromString(String algorithm, String str) throws NoSuchAlgorithmException { 
    MessageDigest md = MessageDigest.getInstance(algorithm); 
    md.update(str.getBytes()); 
    byte byteData[] = md.digest(); 

    //convert the byte to hex format method 1 
    StringBuffer hashCodeBuffer = new StringBuffer(); 
    for (int i = 0; i < byteData.length; i++) { 
     hashCodeBuffer.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return hashCodeBuffer.toString(); 
} 

использование SHA-512 как алгоритм. перейдите по следующей ссылке для другого возможного имени алгоритма, который вы можете передать в методе. https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest

1

В языке Groovy вы можете использовать метод ниже, чтобы генерировать хэш-строку через SHA-512.

Это полностью работает для меня.

public String getHashCodeFromString(String algorithm, String str) throws NoSuchAlgorithmException{ 
     MessageDigest md = MessageDigest.getInstance(algorithm); 
     md.update(str.getBytes()); 
     def byteData = md.digest() as byte[]; 

     //convert the byte to hex format method 1 
     StringBuffer hashCodeBuffer = new StringBuffer(); 
     for (int i = 0; i < byteData.length; i++) { 
     hashCodeBuffer.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
     } 
     return hashCodeBuffer.toString(); 
    } 
Смежные вопросы