2012-12-24 4 views
4

필자는 Field LoginId 및 Password를 사용하여 자격 클래스를 작성했습니다.java.lang.ClassCastException : [B를 java.lang.String에 캐스트 할 수 없습니다.

Iam이 passwrd를 암호화하고 AES_ENCRYPT를 사용하여 db에서 저장합니다.

해독 된 암호 만 검색하려고합니다. 그래서, OPEN JPA 2.0에서 NAtiveQueryis를 사용하여 AES_DECRYPT를 사용합니다. 내가 쓴

쿼리는 다음과 같습니다

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(); 

그러나 메신저는 다음과 같은 예외 받고 다음을 gettng 메신저도 심지어 여기

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

: 나는 심지어이 시도

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) 

을 동일한 예외 :

java.lang.ClassCastException: [B cannot be cast to java.lang.Object 

req를 처리하는 쿼리와 함께 실수가 무엇인지 알 수 있습니까?

+0

왜 데이터베이스에 자바를 사용하면 그렇게 할 수 있습니까? – fge

+1

암호를 암호화하지 마십시오. 암호는 안전하게 _hashed_합니다; 암호를 검색 할 수 없어야합니다. – SLaks

+0

데이터베이스가이 상자를 제공 할 때 Java 라이브러리를 사용하는 이유는 암호가 데이터베이스를 벗어날 필요가 없기 때문입니다. – JimmyB

답변

6

비슷한 질문 : What kind of Java type is "[B"?

의 MySQL의 AES_DECRYPT하지 하지 돌려 String 아니라 "[B"로 표시하는 바이트의 배열. 결과를 byte[]으로 전송하고 그로부터 문자열을 만드십시오.

암호를 해독 할 필요가없는 것처럼 보입니다. 너 그냥 validateUser하고 싶지, 그렇지? - 다른 사람들이 지적했듯이, 보안 해시를 사용해야합니다.

MD5 (안전하지 않은 것으로 간주), SHA1 (거의 표준) 및 SHA2 (SHA1보다 훨씬 안전함)를 필요로하므로 이미 functions을 제공하므로 MySQL을 통해 쉽게이 작업을 수행 할 수 있습니다.

그래서 당신의 방식은 기본적처럼 보일 수 있습니다 : ?1 예를 들어 사용자 이름 자체가 될 수있는 고유의 '소금'로 설정

insert into loginDetails (..., passwordHashSalt, passwordHash) values (..., ?1, SHA1(CONCAT(?1, ?2))), 그리고 ?2는 실제 암호입니다. 소금도 DB에 저장되어야하며 모든 사용자/암호에 대해 고유해야합니다. 따라서 사용자 이름은 당연한 선택입니다. ?1를 확인하는 암호입니다

select 'OK' from loginDetails where ... and passwordHash = SHA1(CONCAT(passwordHashSalt, ?1)) :

다음

, 당신이 할 수있는 특정 암호를 확인합니다.

자세한 내용은 인터넷에서 '암호 해싱'을 검색하십시오 (예 : here 또는 here 참조).

해싱 작업은 원하는 경우 데이터베이스 클라이언트 코드에서 수행 할 수도 있습니다.

+0

암호를 암호화하고 DB 기능을 사용하여 저장하는 것이 좋지 않습니다. ?? – user1909657

+0

제 마지막 편집을 참조하십시오 :) – JimmyB

관련 문제