Secure Hash Algorithm oder etwas ähnliches
-
Hallo zusammen,
Bietet Java eigentlich in der Standardbibliothek (oder EE) eine Implementierung von SHA an? Oder gibt es andere angebotene Hash-Algorithmen?
Habe dies noch nie in Java benötigt und bin gerade etwas erstaunt darüber, dass ich in der Referenz der Bibliothek nichts offensichtliches finden kann.Grüssli
-
Dravere schrieb:
Bietet Java eigentlich in der Standardbibliothek (oder EE) eine Implementierung von SHA an?
Ja
Oder gibt es andere angebotene Hash-Algorithmen?
Ja, auch.
-
Sehr hilfreiche Antwort
Es interessiert mich nicht, dass du es auch nicht weisst. Wenn du es wüsstest, hättest du schliesslich deine Aussage bewiesen mit einem entsprechenden Link auf die Klasse oder Methode.
Oder bist du wirklich so dumm, dass du nicht merkst, dass deine Antwort mir überhaupt nichts nützt? Oder bist du nicht dumm sondern einfach nur asozial? Naja, du kannst es dir selber aussuchen. Ich hoffe, dass du mindestens dies noch hinbekommst.Ich wäre nachwievor dankbar, wenn mir jemand weiterhelfen würde.
Grüssli
-
Dravere schrieb:
Hallo zusammen,
Bietet Java eigentlich in der Standardbibliothek (oder EE) eine Implementierung von SHA an? Oder gibt es andere angebotene Hash-Algorithmen?
Habe dies noch nie in Java benötigt und bin gerade etwas erstaunt darüber, dass ich in der Referenz der Bibliothek nichts offensichtliches finden kann.Grüssli
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
-
@Z,
Danke!MessageDigest
? Das hätte ich nie gefunden. Wäre mir nie in den Sinn gekommen danach zu suchen. Hab zwar dasjava.security
package angeschaut, aber das ist mir nicht aufgefallen. Empfinde ich als eine eher seltsame Namenswahl. Aber gut ... ich will mich nicht beklagen, hauptsache ich muss das Ding nicht selber schreibenGrüssli
-
Dravere schrieb:
MessageDigest
? Das hätte ich nie gefunden. Wäre mir nie in den Sinn gekommen danach zu suchen. Hab zwar dasjava.security
package angeschaut, aber das ist mir nicht aufgefallen. Empfinde ich als eine eher seltsame Namenswahl.A cryptographic hash function is a deterministic procedure that takes an arbitrary block of data and returns a fixed-size bit string, the (cryptographic) hash value, such that an accidental or intentional change to the data will change the hash value. The data to be encoded is often called the "message," and the hash value is sometimes called the message digest or simply digest.
Quelle: http://en.wikipedia.org/wiki/Cryptographic_hash_function
-
Dravere schrieb:
Es interessiert mich nicht, dass du es auch nicht weisst.
Du hast aber danach gefragt
Wenn du es wüsstest, hättest du schliesslich deine Aussage bewiesen mit einem entsprechenden Link auf die Klasse oder Methode.
Oder bist du wirklich so dumm, dass du nicht merkst, dass deine Antwort mir überhaupt nichts nützt? Oder bist du nicht dumm sondern einfach nur asozial?...aber jetzt mal ernsthaft. Meinst du das wirklich im Enrst? Du bist hier derjenige mit über 7000 Forumbeiträgen, bist aber zu blöd oder faul "java sha" in google einzugeben? Nicht dein Ernst hoffentlich.
Dravere schrieb:
MessageDigest
? Das hätte ich nie gefunden. Wäre mir nie in den Sinn gekommen danach zu suchen. Hab zwar dasjava.security
package angeschaut, aber das ist mir nicht aufgefallen. Empfinde ich als eine eher seltsame Namenswahl.Nicht wirklich http://de.wikipedia.org/wiki/Message_Digest
-
Z schrieb:
A cryptographic hash function is a deterministic procedure that takes an arbitrary block of data and returns a fixed-size bit string, the (cryptographic) hash value, such that an accidental or intentional change to the data will change the hash value. The data to be encoded is often called the "message," and the hash value is sometimes called the message digest or simply digest.
Quelle: http://en.wikipedia.org/wiki/Cryptographic_hash_functionSchon klar, bzw. es ist mir klar geworden, als ich Message Digest gelesen habe. Allerdings verwende ich dies nie so und lese es auch nie so. Ich lese meistens "hash value". Habe gerade heute wieder ein Dokument gelesen, wo immer nur von "hash value" die Rede war. Zudem frage ich mich nachwievor, ob es wirklich den richtigen Namen hat. Wäre nicht eher
HashStrategy
oderHashAlgorithm
ein besserer Name? Der "message digest" ist schliesslich eigentlich erst das Byte-Array, welches man von der Methodedigest
zurückerhält. Daher meine ich nachwievor, dass die Klasse den falschen Namen hat.@gastantwort,
Wenn ich per Suche etwas gefunden hätte, hätte ich hier nicht gefragt. Allerdings scheine ich zu spezifisch gesucht zu haben (z.B. in java-forum.org). Per Google oder Bing hatte ich keine grosse Hoffnungen was zu finden, da sha und java einfach zu allgemeingültige Begriffe sind.Und auch wenn es noch so einfach wäre, hättest du ja auch einfach "Klasse MessageDigest" hinschreiben können. Das hätte mir bereits gereicht, dann wäre ich alle Java-Klassen aus der Standardbibliothek danach durchsuchen gegangen und hätte es gefunden.
Grüssli
-
Dravere schrieb:
Allerdings scheine ich zu spezifisch gesucht zu haben (z.B. in java-forum.org). Per Google oder Bing hatte ich keine grosse Hoffnungen was zu finden, da sha und java einfach zu allgemeingültige Begriffe sind.
Verwende immer zuerst Google (die englischsprachige Version). Google indiziert auch Foren. Bei mir liefert "java sha" als ersten Eintrag das: http://download.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html
-
Dravere schrieb:
@gastantwort,
Wenn ich per Suche etwas gefunden hätte, hätte ich hier nicht gefragt. Allerdings scheine ich zu spezifisch gesucht zu haben (z.B. in java-forum.org). Per Google oder Bing hatte ich keine grosse Hoffnungen was zu finden, da sha und java einfach zu allgemeingültige Begriffe sind.Und auch wenn es noch so einfach wäre, hättest du ja auch einfach "Klasse MessageDigest" hinschreiben können. Das hätte mir bereits gereicht, dann wäre ich alle Java-Klassen aus der Standardbibliothek danach durchsuchen gegangen und hätte es gefunden.
Laber doch keinen Quatsch. Die ersten 3 Ergebnisse bei google für "java sha" sind bei mir:
Arena Red | SHA and MD5 in Java
MessageDigest (link zur API Dokumentation)
sha1 - Java Compute SHA-1 - Stack Overflow
-
@gastantwort,
-> Ich hatte keine Hoffnung -> Ich habe es erst gar nicht gemacht ...Java ... Damit verbindet man wirklich nur negatives
Grüssli
-
Dravere schrieb:
@gastantwort,
-> Ich hatte keine Hoffnung -> Ich habe es erst gar nicht gemacht ...Java ... Damit verbindet man wirklich nur negatives
Grüssli
Deine Ablehnung Javas erzeugt eine psychische Blockade, so dass du nicht einmal mehr zur effektiven Internet-Recherche fähig bist. Ich hätte nie geglaubt, dass sowas so weit führen kann.
-
Z schrieb:
Deine Ablehnung Javas erzeugt eine psychische Blockade, so dass du nicht einmal mehr zur effektiven Internet-Recherche fähig bist. Ich hätte nie geglaubt, dass sowas so weit führen kann.
Was erwartest du von einer Sprache, wo man sowas schreiben muss:
MessageDigest sha256; try { sha256 = MessageDigest.getInstance("SHA-256"); } catch(NoSuchAlgorithmException ex) { throw new RuntimeException("theoretical unreachable", ex); }
Das macht einem einfach nur fertig.
Grüssli
-
Dravere schrieb:
Das macht einem einfach nur fertig.
Mir geht es mit C++ so. Wenn dir eine Sprache nicht gefällt, nimm eine andere. Und wenn du dazu gezwungen bist dann reiß dich zusammen und hoffe, dass es möglichst bald vorbei ist.
-
Dasd schrieb:
Dravere schrieb:
Das macht einem einfach nur fertig.
Mir geht es mit C++ so. Wenn dir eine Sprache nicht gefällt, nimm eine andere. Und wenn du dazu gezwungen bist dann reiß dich zusammen und hoffe, dass es möglichst bald vorbei ist.
Man zwingt mich dazu! Und noch zu einigem anderem (Glassfish, JavaEE, JMS, usw.)! Unverschämtheit
Aber es geht zum Glück aktuell ganz gut. Manchmal erfasst es einem halt nur wieder, wenn etwas nicht geht und dann geht man über jedes negative Detail der Sprache herDas Problem sitzt aber natürlich wie immer vor dem Computer
Grüssli
-
Dravere schrieb:
Z schrieb:
Deine Ablehnung Javas erzeugt eine psychische Blockade, so dass du nicht einmal mehr zur effektiven Internet-Recherche fähig bist. Ich hätte nie geglaubt, dass sowas so weit führen kann.
Was erwartest du von einer Sprache, wo man sowas schreiben muss:
MessageDigest sha256; try { sha256 = MessageDigest.getInstance("SHA-256"); } catch(NoSuchAlgorithmException ex) { throw new RuntimeException("theoretical unreachable", ex); }
Das macht einem einfach nur fertig.
Grüssli
Was soll damit sein? Wärs dir lieber, getInstance() würde im Fall des Scheiterns eine Nullreferenz zurückgeben? Du programmierst sonst in C o.ä., oder?
-
Z schrieb:
Was soll damit sein? Wärs dir lieber, getInstance() würde im Fall des Scheiterns eine Nullreferenz zurückgeben? Du programmierst sonst in C o.ä., oder?
Naja, wenn man in C# oder C++ wären, müsste man dieses unnötige Try-Catch gar nicht hinschreiben. Aber sogar in Java hätte man doch die Standardalgorithmen, welche in allen Implementierungen dabei sind, mit einer entsprechenden Methode versehen können:
getSHA256Instance()
. Diese wirft dann auch keine Exception. Für nicht standardisierte Algorithmen, könnte man immer nochgetInstance
anbieten, wo man einen String übergibt.Nein ich programmiere normalerweise nicht in C.
Grüssli
-
Dravere schrieb:
Naja, wenn man in C# oder C++ wären, müsste man dieses unnötige Try-Catch gar nicht hinschreiben.
Du kannst stattdessen ein "throws Exception" an den Methodenkopf hängen, dann musst du Exceptions, die innerhalb der Methode auftreten können, nicht mehr berücksichtigen.
Dravere schrieb:
Aber sogar in Java hätte man doch die Standardalgorithmen, welche in allen Implementierungen dabei sind, mit einer entsprechenden Methode versehen können:
getSHA256Instance()
.SHA256 ist eben nicht zwingend in allen Implementationen der MessageDigest-Klasse enthalten. Es gibt durchaus auch abgespeckte Varianten.
-
Z schrieb:
Du kannst stattdessen ein "throws Exception" an den Methodenkopf hängen, dann musst du Exceptions, die innerhalb der Methode auftreten können, nicht mehr berücksichtigen.
Dann hat man das Problem in der übergeordneten Methode und so weiter bis zur
main
. Dies ist definitiv keine Lösung sondern ein hässlicher Workaround. Ich schreibe mir lieber kurz eine eigenegetSHA256Instance
Methode, welche keine Exception wirft.Dravere schrieb:
SHA256 ist eben nicht zwingend in allen Implementationen der MessageDigest-Klasse enthalten. Es gibt durchaus auch abgespeckte Varianten.
Also wenn ich nach der Java SE Dokumentation gehe, dann werde ich auf Appendix A verwiesen:
Java SE API Dokumentation / Appendix A schrieb:
The JDK Security API requires and uses a set of standard names for algorithms, certificate and keystore types. The specification names previously found here in Appendix A and in the other security specifications (JSSE/CertPath/etc.) have been combined in the Standard Names document. ...
"Standard Names document" ist eine Weiterleitung auf ein Dokument mit den möglichen Namen, worin man die folgenden findet: MD2, MD5, SHA-1, SHA-256, SHA-384 und SHA-512. Wenn man dies so liest, klingt das eher danach, dass diese Algorithmen auf allen Java SE Implementationen vorhanden sein müssen.
Und auch wenn sie dieses Design gewählt haben, wieso haben sie nicht eher eine
IllegalArgumentException
gewählt? Es wird wohl eher sehr selten passieren, dass diese Exception überhaupt geworfen wird. Wieso hat man also nicht eine Exception gewählt, welche von derRuntimeException
erbt, wie dies beiIllegalArgumentException
der Fall ist. Und die würde hier auch absolut gut hinpassen, da man ja einen ungültigen String als Argument übergeben hätte.Es ist immer wieder das Gleiche mit den Exceptions in Java.
InterruptedException
ist ja auch so eine nervtötende Exception in Java. Was man überall an Code sieht, wo diese Exception einfach leer gefangen wird. Die Leute werfen sie oft nicht mal alsRuntimeException
weiter.Aber kritisieren darf man natürlich nicht ...
Grüssli
-
Dravere schrieb:
Also wenn ich nach der Java SE Dokumentation gehe, dann werde ich auf Appendix A verwiesen:
Java SE API Dokumentation / Appendix A schrieb:
The JDK Security API requires and uses a set of standard names for algorithms, certificate and keystore types. The specification names previously found here in Appendix A and in the other security specifications (JSSE/CertPath/etc.) have been combined in the Standard Names document. ...
"Standard Names document" ist eine Weiterleitung auf ein Dokument mit den möglichen Namen, worin man die folgenden findet: MD2, MD5, SHA-1, SHA-256, SHA-384 und SHA-512. Wenn man dies so liest, klingt das eher danach, dass diese Algorithmen auf allen Java SE Implementationen vorhanden sein müssen.
Für mich klingt das eher danach, dass diese Namen verwendet werden müssen, falls die Algorithmen angeboten werden. Die Algorithmen selbst müssen nicht vorhanden sein.
Dravere schrieb:
Und auch wenn sie dieses Design gewählt haben, wieso haben sie nicht eher eine
IllegalArgumentException
gewählt? [...]Zugegeben, die checked exceptions sind nicht immer optimal in Java (bis hin zu nervtötend), aber in diesem Fall berechtigt, da es sich ja möglicherweise um eine Nutzereingabe handelt. In dem Fall ist auch das weiterwerfen als RuntimeException schlecht, da diese ja ggfs. bis nach ganz oben durchfliegt und dein gesamtes Programm abschießt.
In dem Zusammenhang ist auch dein Code schlecht. Besser wäre, die Exception mittels throws oder ähnlichem durchzureichen, bis die Nutzerschnittstelle (oder die Logdatei, scheint sich ja um eine Webapplikation zu handeln) angemessen darauf reagieren kann. Andererseits fehlt mir natürlich auch der Kontext, um das wirklich bewerten zu können.