java.lang.ClassCastException: [B ne peut pas être jeté à java.lang.Chaîne
J'ai écrit une entitity de classe avec le Champ identifiant de connexion et Mot de passe.
Iam cryptage de la passwrd et stoiring dans la db à l'aide de la AES_ENCRYPT.
Je veux restauration uniquement le mot de passe qui est décrypté. donc, im en utilisant AES_DECRYPT à l'aide de NAtiveQueryis Ouvert JPA 2.0.
Requête que j'ai écrit est :
Query q = em.createNativeQuery("select AES_DECRYPT(l.password,?2) from loginDetails l where l.loginID = ?1");
q.setParameter(1, loginId);
q.setParameter(2, getKey());
String s = q.getSingleResult();
Mais je suis de l'exception suivante:
java.lang.ClassCastException: [B cannot be cast to java.lang.String
at com.rcs.chef.validation.UserValidation.decryptedPasswordForID(UserValidation.java:99)
at com.rcs.chef.validation.UserValidation.validateUser(UserValidation.java:81)
at com.rcs.chef.validation.UserValidation.activate(UserValidation.java:72)
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.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:226)
at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:824)
at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:636)
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:724)
at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)
at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:219)
at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:147)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:640)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:331)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:227)
J'ai même essayé ceci:
Query q = em.createNativeQuery("select AES_DECRYPT(l.password,?2) from loginDetails l where l.loginID = ?1");
q.setParameter(1, loginId);
q.setParameter(2, getKey());
List<Object> s = q.getResultList();
String s1 = null;
for(Object o : s){
s1= (String) o;
}
Même ici aussi im gettng la même Exception que :
java.lang.ClassCastException: [B cannot be cast to java.lang.Object
Pouvez-vous me dire quelle est l'Erreur avec la requête de l'adn de la manipulation de la req.
Pourquoi utiliser la base de données de le faire lorsque Java a des bibliothèques pour le faire pour vous?
Ne pas crypter les mots de passe. Les mots de passe doivent être solidement haché; il ne doit jamais être possible de récupérer un mot de passe.
Pourquoi utiliser des bibliothèques Java lorsque la base de données fournit ce hors de la boîte, de sorte que le mot de passe n'avez même pas à quitter la db?
Ne pas crypter les mots de passe. Les mots de passe doivent être solidement haché; il ne doit jamais être possible de récupérer un mot de passe.
Pourquoi utiliser des bibliothèques Java lorsque la base de données fournit ce hors de la boîte, de sorte que le mot de passe n'avez même pas à quitter la db?
OriginalL'auteur user1909657 | 2012-12-24
Vous devez vous connecter pour publier un commentaire.
Question similaire: Ce genre de type Java est "[B"?
MySQL
AES_DECRYPT
ne pas retour d'unString
mais plutôt un tableau d'octets, notée en "B". Fonte le résultat debyte[]
et de construire votre chaîne.Il semble que vous n'avez même pas besoin de décrypter le mot de passe; vous voulez juste
validateUser
, droit? - Dans ce cas, comme d'autres l'ont noté, sécurisé hachages doit être utilisé.Vous pouvez facilement le faire avec MySQL, comme elle l'a déjà fournit le nécessaire fonctions: MD5 (considérés comme douteux), SHA1 (assez standard), et SHA2 (même plus sûr que le SHA1).
De sorte que votre projet peut ressembler à:
insert into loginDetails (..., passwordHashSalt, passwordHash) values ( ..., ?1, SHA1(CONCAT( ?1, ?2 )) )
, où?1
est définie à l'unique "sel", qui peut être par exemple le nom de l'utilisateur lui-même, et?2
est le véritable mot de passe. Notez que le sel doit être stockée dans la base de données et trop de "doit" être unique pour chaque utilisateur/mot de passe; ainsi, le nom d'utilisateur est un choix naturel pour cela.Ensuite, afin de vérifier le mot de passe que vous pouvez faire:
select 'OK' from loginDetails where ... and passwordHash = SHA1(CONCAT( passwordHashSalt, ?1 ))
, où?1
est le mot de passe qui doit être vérifié.Pour plus d'informations, une recherche sur internet pour "hachage de mot de passe", voir par exemple ici ou ici.
Ceux de hachage opérations peuvent également être effectuées dans votre client de base de données de code au lieu de cela, si vous le souhaitez.
Veuillez voir mon dernier edit 🙂
OriginalL'auteur JimmyB