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

Exceptionjava.lang.ClassCastException: [B> không thể được đúc để 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

bạn có gặp lỗi Trình biên dịch không? Cảnh báo? Thời gian chạy ngoại lệ? – stackr

+0

Tôi đã cập nhật các câu hỏi chính nó như tôi đã nhận được expection – theJava

+3

lỗi có vẻ là ở dòng 30 trong tập tin này. Cái nào là dòng 30? –

Trả lời

6

Có vẻ cột mật khẩu của cơ sở dữ liệu của bạn là loại được ánh xạ dưới dạng String bằng Java (varchar có thể nhất). Vì vậy, hibernate không thể chuyển đổi byte của bạn array thành một String.

Bạn có thể thay đổi ngành nghề của bạn để một cái gì đó như:

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

Nhưng nó có lẽ sẽ không làm việc như tiêu hóa chắc chắn sẽ chứa byte không trí trên bản đồ để chars không phụ thuộc vào mã hóa. Có thể bạn nên sử dụng một số base64 encoding để ánh xạ đốm màu nhị phân của bạn thành một Chuỗi.

Một giải pháp khác là thay đổi lược đồ dabase của bạn và tạo trường password thành nhị phân thay vì varchar.

Trong cả hai trường hợp, bạn cần biết cách trường password được chèn vào cơ sở dữ liệu.

Một số nhận xét về mã của bạn:

tôi thấy lạ bạn nên kiểm tra mật khẩu bằng cách chọn một hàng từ cơ sở dữ liệu của bạn với tất cả tên người dùng và mật khẩu.Tôi muốn mặc dù hợp lý hơn để chọn chỉ sử dụng người dùng và sau đó xác nhận mật khẩu được cung cấp dựa vào mật khẩu được trả lại trên cơ sở dữ liệu.

Bạn sử dụng hàm băm để đảm bảo mật khẩu của bạn sẽ không được lưu trữ dưới dạng văn bản thuần trong cơ sở dữ liệu. Tốt lắm. Tuy nhiên, lược đồ của bạn có một lỗ hổng lớn: nếu nhiều người dùng có cùng mật khẩu thì mật khẩu băm sẽ giống nhau trong cơ sở dữ liệu. Vì vậy, nếu bạn có quyền truy cập vào cơ sở dữ liệu và biết mật khẩu của một người dùng thì thật dễ dàng để tìm thấy tất cả những người dùng chia sẻ mật khẩu này. Để xây dựng thứ gì đó an toàn hơn, bạn nên sử dụng lược đồ mã hóa mật khẩu bao gồm một số salt.

+0

Tôi không hiểu ý nghĩa của việc sử dụng thêm muối để lưu trữ mật khẩu băm. Nếu bạn không chọn "bảo mật theo tối nghĩa", bạn sẽ phải cung cấp tất cả thông tin để tạo lại băm không? Bạn có thể cho tôi một liên kết để biết thêm thông tin về lời khuyên này không? – mtraut

+0

@mtraut trong trường hợp này, lợi ích chính của muối là đảm bảo tính duy nhất của mật khẩu được băm. – gabuzo

+0

@mtraut trong trường hợp này, lợi ích chính của muối là đảm bảo tính duy nhất của mật khẩu băm. Muối được chọn ngẫu nhiên khi băm mật khẩu và được thêm vào mật khẩu băm. Bạn có thể xem http://aspirine.org/htpasswd_en.html để có ví dụ triển khai. Nó chọn 'MD5' làm thuật toán và mã hóa nhiều lần cùng một mật khẩu bạn sẽ thấy rằng mật khẩu băm khác nhau mỗi lần. Trong lược đồ băm này, muối là trường giữa '$' sau '$ apr1 $'. Kiểm tra liên kết trong câu trả lời để biết thêm thông tin. – gabuzo

0

Lỗi này có vẻ phù hợp 30, mà tôi đoán là Object[] dòng tham số. Trong trường hợp này, bạn cần chuyển đổi thông số byte[] thành Chuỗi và sử dụng chuỗi làm tham số.

câu trả lời này được đưa ra trước khi câu hỏi được chỉnh sửa.

bọc mọi thứ trong các chức năng:

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

của khóa học có liên quan try/catch vẫn còn ở đó.

Cố gắng di chuyển ra khỏi thói quen e.printStackTrace() để viết để ghi tệp bằng java.utils.logging.Logger hoặc log4j.

cố gắng chỉ có một trở lại trong hàm. nếu bạn giữ mã giống nhau, hãy xác định Login login1=null khi bắt đầu chức năng và chỉ cần chỉ định trong khối khác. Sự trở lại ở cuối nên là return login1 (mà sẽ là null hoặc một số giá trị).

các phần mà bạn vẫn còn mã được triển khai (ví dụ: lỗi dude) phải được nhận xét với //TODO:. Hầu hết các id như eclipse/netbeans đều tự động tìm thấy các chú thích này dưới dạng nhiệm vụ.

+0

'log4j', không phải 'log4net' ;-) – gabuzo

+0

@gabuzo được sửa. cảm ơn. –

2

có vẻ như bạn đang [truyền một mảng byte có yêu cầu chuỗi.

thử { login.getEmail(), new String(digest) }; thay vì { login.getEmail(), digest };

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

+0

Sẽ không hoạt động vì tiêu hóa chắc chắn sẽ không chứa chuỗi byte char. – gabuzo

+0

@Nishant Cảm ơn bạn đã chia sẻ. 'new String (" Any String ")' giải quyết vấn đề của tôi. Cộng một cho việc này. – OO7

Các vấn đề liên quan