2011-01-11 12 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

+0

私はexpectionを得ていたので質問自体を更新しました – theJava

+3

このファイルの30行目にエラーがあるようです。どれが30行目ですか? –

答えて

6

データベースのパスワード列は、JavaでString(おそらくvarchar)としてマップされたタイプであるようです。したがって、ハイバネートはあなたのバイトarrayStringに変換できません。

はあなたのような何かにあなたの行を変更することができます。

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

しかし、それはおそらく、最も確かにかかわらず、エンコーディングの文字にマップできないバイトが含まれていますダイジェストとして機能しません。バイナリBLOBを文字列にマップするには、おそらくbase64 encodingを使用するべきです。

もう1つの解決策は、データベースのスキームを変更し、varcharではなくpasswordフィールドをバイナリにすることです。

どちらの場合でも、passwordフィールドがデータベースにどのように挿入されているかを知る必要があります。

あなたのコードのいくつかの発言:

私はユーザー名とパスワードの両方を使用してデータベースから行を選択して、パスワードを確認することを奇妙見つけます。私はより論理的だが、ユーザーだけを使用して選択し、データベースで返されたものに対して提供されたパスワードを検証することができます。

パスワードがデータベースにプレーンテキストで保存されないように、ハッシュ関数を使用します。それは良い。しかし、あなたのスキームはの大きなという欠陥があります。複数のユーザーが同じパスワードを持っていると、ハッシュされたパスワードはデータベース内で同じになります。したがって、データベースにアクセスして1人のユーザーのパスワードを知っていれば、このパスワードを共有しているすべてのユーザーを見つけるのは簡単です。より安全なものを構築するには、saltを含むパスワードエンコーディングスキームを使用する必要があります。

+0

私はパスワードハッシュを格納するために追加の塩を使用する意味を持っていません。あなたが "あいまいでセキュリティ"を選択しない場合は、とにかくハッシュを再構築するためにすべての情報を提供する必要がありますか?このアドバイスの詳細については、私にリンクを教えてください。 – mtraut

+0

@mtrautこの場合、塩の主な利点は、ハッシュされたパスワードの一意性を保証することです。 – gabuzo

+0

@mtrautこの場合、塩の主な利点は、ハッシュされたパスワードの一意性を保証することです。 saltは、パスワードをハッシュするときランダムに選択され、ハッシュされたパスワードの前に付加されます。実装例については、http://aspirine.org/htpasswd_en.htmlをご覧ください。それは、アルゴリズムとして「MD5」を選択し、同じパスワードを複数回暗号化すると、ハッシュされたパスワードが毎回異なることがわかります。このハッシュ・スキームでは、saltは '$ apr1 $'の後の '$'の間のフィールドです。詳細については、回答のリンクを確認してください。 – gabuzo

0

にキャストできないエラーがObject[]である私は推測していた、ライン30内にあるように見えますパラメータ行。この場合、byte[]ダイジェストをStringに変換し、その文字列をパラメータとして使用する必要があります。

この回答は、質問が編集される前に与えられました。機能で

ラップ物事:もちろん、関連するtry/catch

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

はまだそこにあります。

習慣e.printStackTrace()から、java.utils.logging.Loggerまたはlog4jを使用してログファイルに書き込むようにしてください。

この関数では1つの戻り値しか持たないようにしてください。コードを同じにする場合は、関数の先頭にLogin login1=nullを定義し、単にelseブロックに代入します。最後の返品はreturn login1(nullまたは何らかの値)にする必要があります。

コードがまだ実装されている部分(例:エラーdude)は、//TODO:とコメントする必要があります。 eclipse/netbeansのようなものは、これらのコメントをタスクとして自動的に見つけます。

+0

'log4j'ではなく' log4net' ;-) – gabuzo

+0

@ gabuzoが修正されました。ありがとう。 –

2

[文字列が必要なバイト配列を渡しているようです。

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#String%28byte[]%を参照してください。代わりに{ login.getEmail(), digest };

{ login.getEmail(), new String(digest) };を試してみてください29

+0

ダイジェストには必ずcharバイトシーケンスが含まれないため、動作しません。 – gabuzo

+0

@Nishant共有してくれてありがとう。 '新しい文字列("任意の文字列 ")'これは私の問題を解決します。それにプラス1つ。 – OO7

関連する問題