2011-01-11 101 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; 
    } 

異常java.lang.ClassCastException:[B>不能轉換爲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

你會得到編譯器錯誤?警告?運行時異常? – stackr 2011-01-11 08:49:24

+0

我已經更新了這個問題本身,因爲我越來越期待 – theJava 2011-01-11 08:58:15

+3

錯誤似乎是在這個文件的第30行。哪一條是第30行? – 2011-01-11 09:02:12

回答

6

似乎數據庫的密碼列是映射爲Java中的String的類型(最可能是varchar)。所以休眠不能將你的字節array轉換爲String

你可以改變你的行是這樣的:

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 }; 

但它可能不會爲摘要工作肯定會包含字節不是可映射字符不管編碼。您應該使用base64 encoding將二進制blob映射到字符串。

另一種解決方案是更改您的dabase方案並使password字段成爲二進制而不是varchar

在這兩種情況下,您都需要知道password字段在數據庫中的插入方式。

在你的代碼的一些言論:

我覺得奇怪的是,你用的用戶名和密碼都來自你的數據庫中選擇行檢查密碼。我更願意選擇只使用用戶,然後驗證提供的密碼與數據庫上返回的密碼。

您使用散列函數來確保您的密碼不會以純文本形式存儲在數據庫中。那很好。然而你的方案有一個缺陷:如果幾個用戶有相同的密碼,那麼哈希密碼將在數據庫中相同。因此,如果您有權訪問數據庫並知道一位用戶的密碼,那麼可以非常輕鬆地找到所有共享該密碼的用戶。爲了構建更安全的應用程序,您應該使用包含salt的密碼編碼方案。

0

的誤差似乎是在線路30,其我猜測是Object[]參數行。在這種情況下,您需要將byte[]摘要轉換爲字符串並將該字符串用作參數。

這個答案是在編輯問題之前給出的。

包東西在功能:

byte[] digest = getMessageDigest(login.getPassword()); 
login1 = verifyPassword(login.getEmail(), digest); 
過程中的相關 try/ catch

仍然存在。

嘗試從習慣e.printStackTrace()轉移到使用java.utils.logging.Logger或log4j寫入日誌文件。

嘗試在函數中只有一個返回值。如果保持代碼相同,則在函數的開始處定義Login login1=null,並簡單地在else塊中分配。最後的回報應該是return login1(這將是空值或某個值)。

您仍需要執行代碼的部分(例如錯誤的傢伙)應使用//TODO:進行註釋。像eclipse/netbeans這樣的大多數IDE會自動將這些註釋作爲任務。

+0

`log4j`,而不是`log4net` ;-) – gabuzo 2011-01-11 09:16:14

2

看起來像你[傳遞一個字節數組,其中需要一個字符串。

嘗試{ login.getEmail(), new String(digest) };代替{ login.getEmail(), digest };

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

相關問題