2013-02-15 2 views
25

MessageDigest.getInstance("SHA"), похоже, работает и дает мне MessageDigest, но я не могу сказать, какой алгоритм он мне дает.Какой конкретный алгоритм хэширования возвращает MessageDigest.getInstance («SHA»)?

Это SHA-1 или SHA-0 или ..?


Меня не интересует, что происходит на моей машине. Я хочу знать, вернет ли он sha0 или sha1 для всех допустимых реализаций Java (или это не определено).

+1

Простой способ понять это будет использовать то, что возвращается в хэш строку «Быстрая коричневая лиса перепрыгивает через ленивую собаку» и исследовать выход. Если вы получите '2fd4e1c6-7a2d28fc-ed849ee1-bb76e739-1b93eb12 'тогда у вас есть SHA-1. Ответ Ли Меадора показывает программный способ увидеть, что означает' SHA'. –

+0

@NikBougalis, вы также проверяли, происходит ли тот же вывод для обоих sha-0 и sha-1? я знаю, что они могут быть разными? Я даже не могу найти описание sha-0 где угодно. – megazord

+2

Они разные. –

ответ

23

В списке JCE Specification перечислены стандартные имена, которые предполагается поддерживать в реализации. «SHA-1» указан как SHA-256, SHA-384 и SHA-512. «SHA», «SHA-0» и SHA-2 »не являются стандартными именами и, следовательно, могут вообще не поддерживаться. Вы не можете гарантировать, что« SHA »вернется, если вообще что-то, потому что оно не соответствует стандарту.

+1

Очень хороший ответ. Никогда не оставляйте что-либо подобное в сомнении и используйте настоящее имя, а не «псевдоним» и, если возможно, никогда не оставляйте ничего для значений по умолчанию (например, всегда указывайте «AES/CBC/PKCS5Padding», поскольку «AES» «вернется» Шифрование режима ECB для 'Cipher.getInstance()' в реализации SunJCE). –

+0

Спасибо, это то, что я искал. Таким образом, другими словами, ответ на мой фактический вопрос «ни/не определено». – megazord

+1

Если я правильно понимаю эту проблему, то вы называете это «стандартные имена», например «SHA-384» и «SHA-512», которые могут быть использованы. Но платформа Java не обязана поддерживать эти алгоритмы. JavaDoc [MessageDigest] (http://docs.oracle.com/javase/8/docs/api/java/security/MessageDigest.html) и [этот URL] (http://docs.oracle.com/javase/ 8/docs/technotes/guides/security/StandardNames.html) (google «должен поддерживать») говорят, что требуется SHA-256, но не SHA-384 или SHA-512. –

17

SHA-0 устарел. Для использования с Java JCE MessageDigest, SHA == SHA-1 для некоторых поставщиков JCE. Кстати, SHA-1 не считается безопасным с сегодняшними компьютерами и технологиями. SHA-512 по-прежнему безопасен практически для всего. SHA-256 в порядке для большинства вещей.

Вы можете указать протоколы, доступные в версии Java, используемой с этим кодом. (Я получил его here):

import java.security.Provider; 
import java.security.Security; 

public class JceLook { 

    public static void main(String[] args) { 
     System.out.println("Algorithms Supported in this JCE."); 
     System.out.println("===================="); 
     // heading 
     System.out.println("Provider: type.algorithm -> className" + "\n aliases:" + "\n attributes:\n"); 
     // discover providers 
     Provider[] providers = Security.getProviders(); 
     for (Provider provider : providers) { 
      System.out.println("<><><>" + provider + "<><><>\n"); 
      // discover services of each provider 
      for (Provider.Service service : provider.getServices()) { 
       System.out.println(service); 
      } 
      System.out.println(); 
     } 
    } 
} 

Он покажет информацию, как это для всех различных алгоритмов, доступных. (Обратите внимание, что это фактический вывод из программы выше для некоторого уровня обновления Oracle/Sun Java 6, и это показывает, что SHA эквивалентен SHA-1 и SHA1. Вы можете передать любую из трех строк в MessageDigest и получить тот же результат . Но это зависит от криптографического провайдера (ОКО) и не может быть такой же.)

SUN: MessageDigest.SHA -> sun.security.provider.SHA 
    aliases: [SHA-1, SHA1] 
    attributes: {ImplementedIn=Software} 

При загрузке дополнительных поставщиков (например, BouncyCastle) он будет показывать их тоже.

+0

Меня не интересует, что происходит на моей машине. Я хочу знать, вернет ли он sha0 или sha1 для всех допустимых реализаций Java (или это не определено). – megazord

+0

Я подозреваю, что он не определен, но я очень сомневаюсь, что * любая реализация Java вернет 'SHA-0'. Он был отозван после того, как был обнаружен и исправлен дефект дизайна, производя «SHA-1». –

+0

«Но это зависит от поставщика криптографии (JCE) и может и не быть одинаковым». WTF. Тогда как вы можете быть уверены, что вызываете правильную хэш-функцию? @NikBougalis Я был бы немного удивлен, так как не знаю никаких приложений, требующих SHA-0, но лучше быть в безопасности, чем сожалеть. – megazord

Смежные вопросы