java.lang.ClassCastException: [B > ne peut pas être jeté à java.lang.Chaîne
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;
}
Exception
> 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)
êtes-vous d'obtenir des Erreurs de compilation? Mises en garde? Des Exceptions D'Exécution?
J'ai mis à jour la question elle-même que j'ai été faire exception
l'erreur semble être à la ligne de 30 dans ce fichier. Dont l'un est ligne 30?
J'ai mis à jour la question elle-même que j'ai été faire exception
l'erreur semble être à la ligne de 30 dans ce fichier. Dont l'un est ligne 30?
OriginalL'auteur theJava | 2011-01-11
Vous devez vous connecter pour publier un commentaire.
Semble la colonne mot de passe de votre base de données est un type mappé comme
String
en Java (varchar
plus probablement). Donc, hibernate ne peut pas convertir votre octetarray
à unString
.Vous pouvez changer vos lignes à quelque chose comme:
Mais il ne sera probablement pas fonctionner comme le recueil sera très certainement octets contiennent pas transposable à caractères indépendamment de l'encodage. Vous devriez probablement utiliser un le codage base64 à la carte vous blob binaire à une Chaîne.
Une autre solution sera de changer votre dabase régime et faire de l'
password
champ binaire plutôt qu'unvarchar
.Dans les deux cas, vous devez savoir comment le
password
champ est inséré dans la base de données.Quelques remarques sur ton code:
Je trouve étrange que vous vérifiez le mot de passe en sélectionnant une ligne à partir de votre base de données à la fois le nom d'utilisateur et le mot de passe. Je serais bien plus logique de le sélectionner en utilisant uniquement l'utilisateur puis de valider le mot de passe fourni à l'encontre de l'un est retourné sur la base de données.
Vous utilisez une fonction de hachage pour assurer votre mot de passe ne sont pas stockés en clair dans la base de données. Ce qui est bon. Toutefois, votre plan a un grand défaut: si plusieurs utilisateurs ont le même mot de passe, puis le hachage de mot de passe sera le même dans la base de données. Donc, si vous avez accès à la base de données et de connaître le mot de passe d'un utilisateur, il va être vraiment facile de trouver tous les utilisateurs de partager ce mot de passe. Dans le but de construire quelque chose de plus sécurisé, vous devez utiliser un mot de passe schéma de codage qui comprennent certains sel.
dans ce cas, le principal avantage du sel est de garantir l'unicité de mots de passe hachés.
dans ce cas, le principal avantage du sel est de garantir l'unicité de mots de passe hachés. Le sel est choisi de façon aléatoire lorsque le hachage du mot de passe et est ajouté le mot de passe haché. Vous pouvez avoir un coup d'oeil à aspirine.org/htpasswd_en.html pour un exemple de mise en œuvre. Sélectionnez
MD5
comme l'algorithme et de chiffrer plusieurs fois le même mot de passe, vous verrez que le hachage de mot de passe est différent à chaque fois. Dans ce régime de hachage, le sel est le champ entre le$
après$apr1$
. Vérifier le lien dans la réponse pour plus d'informations.Je sais ce qu'est un sel n' - ce que je doute, c'est que cela améliore la sécurité en cas de hachage de mot de passe de stockage, au moins dans le cas que vous avez mentionné. Mathématiquement il n'y a pas de grosse différence en comparant un groupe d'octets ou de la première extraction du sel, rehasing le fameux mot de passe et de les comparer ensuite (tous en comparaison à une attaque par force brute).
Oui vous avez tout à fait raison. Tout dépend de combien de connu mots de passe que vous souhaitez vérifier. Si vous avez un par défaut mot de passe et de ce qui vérifier si, par hasard, certains utilisateurs n'oubliez pas de modifier le sel ne fera pas une grosse différence. D'autre part, si vous êtes la planification d'une attaque par dictionnaire sur une base de données avec plusieurs centaines d'utilisateurs le sel va faire une différence significative: 2 jours en attaque à son tour dans un de 200 jours d'attaque avec 100 utilisateurs.
OriginalL'auteur gabuzo
dirait que vous êtes [le passage d'un tableau d'octets lorsqu'une chaîne est nécessaire.
essayer
{ login.getEmail(), new String(digest) };
au lieu de{ login.getEmail(), digest };
reportez-vous http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#String%28byte%5B%5D%29
Merci pour le partage.
new String("Any String")
cela résout mon problème. Plus un pour cette.OriginalL'auteur Nishant
L'erreur semble être dans la ligne 30, qui je suppose est le
Object[]
paramètres de la ligne. Dans ce cas, vous devez convertir lebyte[]
digest à Chaîne et d'utiliser la chaîne comme paramètre.cette réponse a été donnée avant que la question a été édité.
envelopper les choses en fonctions:
de cours pertinents
try
/catch
sont toujours là.Essayer de s'éloigner de l'habitude
e.printStackTrace()
à l'écriture dans des fichiers journaux avec java.utils.la journalisation.Logger ou log4j.essayer d'avoir un seul retour de la fonction. si vous gardez le code même, définir
Login login1=null
au début de la fonction, il suffit d'attribuer dans le bloc else. Le retour à la fin doit êtrereturn login1
(ce qui serait la valeur null ou une autre valeur).les pièces où vous disposez d'un code toujours être mises en œuvre (par exemple, erreur de mec) doit être commentée avec
//TODO:
. La plupart des ide comme eclipse/netbeans trouver automatiquement ces commentaires comme des tâches.log4j
, paslog4net
😉corrigés. merci.
OriginalL'auteur Kinjal Dixit