2011-01-05 5 views
17

Ich versuche MD5 verschlüsselten Durchlauf von MySQL DB über Java-Code (Hibernate) zu bekommen. Aber ich kann weder String noch irgendeinen vernünftigen Java-Typ bekommen.Welcher Java-Typ ist "[B"?

Das einzige, was ich immer bin, ist dies nicht hilfreich Nachricht: java.lang.ClassCastException: [B nicht gegossen werden kann (oder was auch immer Java-Typ I werfen versuchen) com.mysql.jdbc.Blob.

Hier ist meine Methode:

public void testCrypto() { 
     session.beginTransaction(); 
     // creates native SQL query 
     // uses native MySQL's MD5 crypto 
     final Blob pass = (Blob) session.createSQLQuery("SELECT MD5('somePass')") 
      .list().get(0); 
     session.getTransaction().commit(); 
} 

Hier ist voller Stack-Trace:

java.lang.ClassCastException: [B cannot be cast to com.mysql.jdbc.Blob 
    at domain.DatabaseTest.testCrypto(DatabaseTest.java:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at junit.framework.TestCase.runTest(TestCase.java:168) 
    at junit.framework.TestCase.runBare(TestCase.java:134) 
    at junit.framework.TestResult$1.protect(TestResult.java:110) 
    at junit.framework.TestResult.runProtected(TestResult.java:128) 
    at junit.framework.TestResult.run(TestResult.java:113) 
    at junit.framework.TestCase.run(TestCase.java:124) 
    at junit.framework.TestSuite.runTest(TestSuite.java:232) 
    at junit.framework.TestSuite.run(TestSuite.java:227) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Antwort

35

, dass mein Freund ein Array von Bytes ist. In JNI wird [B verwendet, um ein Array ([) von Bytes (B) zu beschreiben. Ein Array von ints ist [I usw.

Sie können hier ein bisschen mehr Informationen über Felddeskriptoren erhalten:
http://java.sun.com/docs/books/jni/html/types.html (section 12.3.3 sollte das sein, was Sie suchen).

+0

Vielen Dank, haben Sie schon sehr hilfreich! – Xorty

3

[B ist der Name des codierten Typs für ein Byte-Array (Byte []), der normalerweise nur in Typ-Signatur-Strings erscheinen sollte, da es kein gültiger Typname ist.

6

Es ist der Klassenname byte[].class. Versuchen Sie diese:

System.out.println(byte[].class.getName()); 

Ausgang (Sie ahnen es):

[B

Und wenn Sie den lesbaren Namen zugreifen möchten, verwenden Sie Class.getCanonicalName():

System.out.println(byte[].class.getCanonicalName()); 

Ausgabe:

byte []

4

Wie die anderen Antworten Zustand, das ist ein Byte-Array.

Wenn Sie eine Zeichenfolge aus einem Byte-Array erhalten möchten, verwenden Sie den String-Konstruktor:

public void testCrypto() 
{ 
     session.beginTransaction(); 
     // creates native SQL query 
     // uses native MySQL's MD5 crypto 
     final String pass = new String(session.createSQLQuery("SELECT MD5('somePass')") 
      .list().get(0)); 
     session.getTransaction().commit(); 
} 
+0

großartig, aber das ist wirklich seltsames Verhalten! Dieser String ist genau derselbe wie der, der die mysql-Konsole ausgibt. Aber pass.getBytes(). Length sagt seine 32, und MD5 sollte 128bits sein. Wo habe ich den Hinweis verloren? – Xorty

+1

@ Xorty: Es besteht ein Unterschied zwischen der Messung der Verschlüsselungsstärke und der Länge eines Strings. MD5 konvertiert jede Eingabe in eine Zeichenfolge, die nicht mehr und nicht weniger als 32 Hexadezimalzeichen enthält. –

+0

Großartig, Mythos kaputt;) – Xorty