2011-01-11 28 views
8
public Login authenticate(Login login) { 
     try { 
      MessageDigest md = MessageDigest.getInstance("SHA-256"); 
      String password = login.getPassword(); 
      try { 
       md.update(password.getBytes("UTF-16")); 
       byte[] digest = md.digest(); 
       String query = "SELECT L FROM Login AS L WHERE L.email=? AND L.password=?"; 
       Object[] parameters = { login.getEmail(), digest }; 
       List<Login> resultsList = (getHibernateTemplate().find(query,parameters)); 
       if (resultsList.isEmpty()) { 
         //error dude 
        } 
       else if (resultsList.size() > 1) { 
         //throw expections 
        } 
       else { 
         Login login1 = (Login) resultsList.get(0); 
         return login1; 
       } 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }     
     return null; 
    } 

Excepciónjava.lang.ClassCastException: [B> no puede ser echado a java.lang.String

> java.lang.ClassCastException: [B 
> cannot be cast to java.lang.String 
>   at org.hibernate.type.StringType.toString(StringType.java:44) 
>   at org.hibernate.type.NullableType.nullSafeToString(NullableType.java:93) 
>   at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:140) 
>   at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:116) 
>   at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:39) 
>   at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:491) 
>   at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563) 
>   at org.hibernate.loader.Loader.doQuery(Loader.java:673) 
>   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
>   at org.hibernate.loader.Loader.doList(Loader.java:2213) 
>   at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
>   at org.hibernate.loader.Loader.list(Loader.java:2099) 
>   at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) 
>   at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) 
>   at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) 
>   at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) 
>   at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) 
>   at org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:856) 
>   at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373) 
>   at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:847) 
>   at com.intermedix.services.LoginService.authenticate(LoginService.java:30) 
>   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method) 
>   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
>   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
>   at java.lang.reflect.Method.invoke(Method.java:597) 
>   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301) 
>   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
>   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
>   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
>   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
>   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
>   at $Proxy31.authenticate(Unknown Source) 
>   at com.intermedix.ui.LoginDailog.checkLogin(LoginDailog.java:106) 
>   at com.intermedix.ui.LoginDailog.access$0(LoginDailog.java:102) 
>   at com.intermedix.ui.LoginDailog$2.handleAction(LoginDailog.java:88) 
>   at com.vaadin.event.ActionManager.handleAction(ActionManager.java:228) 
>   at com.vaadin.event.ActionManager.handleActions(ActionManager.java:198) 
>   at com.vaadin.ui.Panel.changeVariables(Panel.java:345) 
>   at com.vaadin.ui.Window.changeVariables(Window.java:1073) 
>   at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1094) 
>   at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:590) 
>   at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:266) 
>   at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:476) 
>   at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
>   at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
>   at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
>   at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
>   at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
>   at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
>   at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
>   at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
>   at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
>   at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
>   at org.mortbay.jetty.Server.handle(Server.java:326) 
>   at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
>   at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943) 
>   at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) 
>   at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
>   at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
>   at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
>   at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
+2

¿Está recibiendo errores del compilador? ¿Advertencias? Excepciones de tiempo de ejecución? – stackr

+0

He actualizado la pregunta en sí, ya que estaba obteniendo la excepción – theJava

+3

, el error parece estar en la línea 30 de este archivo. ¿Cuál es la línea 30? –

Respuesta

6

Parece que la columna de la contraseña de su base de datos es un tipo mapeado como String en Java (varchar lo más probable). Entonces hibernate no puede convertir su byte array a String.

Usted puede cambiar sus líneas a algo como:

String digest = new String(md.digest()); 
String query = "SELECT L FROM Login AS L WHERE L.email=? AND L.password=?"; 
Object[] parameters = { login.getEmail(), digest }; 

Pero probablemente no va a funcionar como el compendio con toda seguridad, compuesta por bytes no asignables a caracteres independientemente de la codificación. Probablemente deberías usar un base64 encoding para asignar tu blob binario a una Cadena.

Otra solución será cambiar el esquema de base de datos y hacer que el campo password sea binario en lugar de varchar.

En ambos casos, debe saber cómo se inserta el campo password en la base de datos.

Algunas observaciones sobre su código:

me parece extraño que compruebe la contraseña mediante la selección de una fila de la base de datos tanto con el nombre de usuario y la contraseña.Aunque era más lógico seleccionar usar solo al usuario y luego validar la contraseña suministrada con la que se devuelve en la base de datos.

Utiliza una función hash para garantizar que su contraseña no se almacene en texto sin formato en la base de datos. Eso es bueno. Sin embargo, su esquema tiene una falla de big: si varios usuarios tienen la misma contraseña, la contraseña de hash será la misma en la base de datos. Entonces, si tiene acceso a la base de datos y conoce la contraseña de un usuario, será muy fácil encontrar a todos los usuarios que comparten esta contraseña. Para construir algo más seguro, debe usar un esquema de codificación de contraseña que incluya algunos salt.

+0

No entiendo el significado de usar una sal adicional para almacenar contraseñas hash. Si no optas por "seguridad por oscuridad", tendrás que proporcionar toda la información para reconstruir el hash de todos modos. ¿Podría darme un enlace para obtener más información sobre este consejo? – mtraut

+0

@mtraut, en este caso, el principal beneficio de la sal es garantizar la singularidad de las contraseñas hash. – gabuzo

+0

@mtraut, en este caso, el principal beneficio de la sal es garantizar la exclusividad de las contraseñas hash. La sal se elige aleatoriamente al hacer hash la contraseña y se antepone a la contraseña hash. Puede echar un vistazo a http://aspirine.org/htpasswd_en.html para ver un ejemplo de implementación. Selecciona 'MD5' como algoritmo y encripta varias veces la misma contraseña, verá que la contraseña hash es diferente cada vez. En este esquema de hash, sal es el campo entre '$' después de '$ apr1 $'. Verifique el enlace en la respuesta para más información. – gabuzo

0

El error parece estar en la línea 30, que supongo que seguirán es el Object[] línea de parámetros. En ese caso, debe convertir el resumen byte[] a String y usar la cadena como parámetro.

esta respuesta se dio antes de que se editara la pregunta.

envolver las cosas en funciones:

byte[] digest = getMessageDigest(login.getPassword()); 
login1 = verifyPassword(login.getEmail(), digest); 

por supuesto, el correspondiente try/catch todavía están allí.

Trate de alejarse del hábito e.printStackTrace() para escribir en los archivos de registro con java.utils.logging.Logger o log4j.

intenta tener solo un retorno en la función. si mantiene el mismo código, defina Login login1=null al comienzo de la función y simplemente asigne en el bloque else. El retorno al final debe ser return login1 (que sería nulo o algún valor).

las partes en las que aún debe implementar el código (por ejemplo error dude) deben comentarse con //TODO:. La mayoría de los ídolos como eclipse/netbeans automáticamente encuentran estos comentarios como tareas.

+0

'log4j', no' log4net' ;-) – gabuzo

+0

@gabuzo corregido. Gracias. –

2

parece que estás [pasando una matriz de bytes donde se requirió una cadena.

tratar { login.getEmail(), new String(digest) }; en lugar de { login.getEmail(), digest };

refieren http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#String%28byte[]% 29

+0

No funcionará, ya que el resumen no contendrá ninguna secuencia de bytes de caracteres. – gabuzo

+0

@Nishant Gracias por compartir. 'new String (" Cualquier cadena ")' esto resuelve mi problema. Más uno para esto – OO7

Cuestiones relacionadas