2015-01-17 4 views
2

저는 PrimeFaces를 사용하여 JSF 응용 프로그램으로 이전 Java 데스크탑 스윙 응용 프로그램을 다시 작성하고 있습니다.최대 절전 모드에서 MySql PASSWORD() 함수 사용

이전 응용 프로그램은 최대 절전 모드를 사용하지 않았지만 새 응용 프로그램에서 사용하기로 결정했습니다. 다 잘 작동하지만 문제는 MySql의 함수 암호()를 사용하여 최대 절전 모드로 암호를 저장하려고 할 때입니다.

암호를 변경하지 않고 이전 데이터베이스의 데이터를 새 데이터베이스로 가져올 수 있으면 좋을 수 있기 때문에이 방법이 있습니까?

나는이 코드를 사용하여 작업 할 로그인을 가지고 관리 : 나는 어떻게 저장 암호를 알 수 없기 때문에 여기

public User login(String username, String password) { 

    User result = null; 

    Session session = HibernateUtil.getSessionFactory().openSession(); 
    try { 
     String sql = "select s from User where username=:username and password=password(:password)"; 
     Query query = session.createQuery(sql); 
     query.setString("username", username); 
     query.setString("password", password); 

     result = (User) query.uniqueResult(); 

     if (result != null) { 
      Hibernate.initialize(result.getUserData()); 
     } 
    } 
    finally { 
     session.close(); 
    } 

    return result; 
} 

그러나 새로운 사용자 등록에 문제가 있습니다. 나는 전체 삽입 문에게 옛날 방식을 쓸 수 있습니다 알고 있지만 다음 최대 절전 모드와 코드가 예쁘게 것이다 사용하는 점은 무엇입니까

public User addUser(User obj) { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 

    try { 
     session.save(obj); 
     session.flush(); 
    } 
    finally { 
     session.close(); 
    } 
    return obj; 
} 

:처럼 나는 데이터베이스에 사용자를 저장하기 위해 사용하고 코드 보인다. 또한 로그인 스 니펫에도 만족하지 않습니다. 또한 삽입 후 트리거와 암호를 업데이트하려고했지만 나는 점점 오류를 유지 :

Updating of NEW row is not allowed in after trigger 

그래서 나는 그것의 추악한 때문에이 방법을 포기하고 그것이 작동하지 않습니다.

jasypt 또는 다른 라이브러리를 사용하여 응용 프로그램의 암호를 암호화하고이를 사용해야합니까? 아니면 내 문제에 우아한 해결책이있다.

답변

1

UserType에 암호 해싱을 위임하므로 Jasypt EncryptedStringType을 사용하면 훨씬 편리합니다.

이렇게하면 응용 프로그램 논리가 암호 관련 책임 (예 : 비 휴대용 PASSWORD SQL 함수를 사용하는 SELECT의 경우)을 처리 할 필요가 없습니다.

또한 UserType은 INSERT/UPDATE에 대한 실제 암호를 해싱합니다.

따라서 Jasypt은 훨씬 더 나은 대안입니다.

+0

어쩌면 내가 간과 한 것이지만 암호화를위한 것이 아닌 Jasypt 라이브러리입니까? 해시 함수를 찾을 수 없으며 사용자 암호는 암호화되지 않은 해시가되어야합니다. – martinstoeckli

+0

암호화는 단방향 (해싱) 또는 양방향 (개인 키 및 공개 키) 일 수 있습니다. 해싱은 MD5, SHA-1 또는 SHA-2로 수행 할 수 있으며 Jasypt는이를 지원합니다. –

+0

좋아, 마침내 내가 검색 한 페이지를 찾았는데 한 방향 해시가 참으로 [지원되는] 것으로 보인다 (http://www.jasypt.org/howtoencryptuserpasswords.html), [예제 코드] (http : //www.jasypt.org/encrypting-passwords.html). 대개는 암호화 (양방향)와 해싱 (단방향)을 구별합니다. – martinstoeckli

1

암호 해시를 위해 MySql 함수 password()을 사용하면 안됩니다.

The PASSWORD() function is used by the authentication system in MySQL Server; you should not use it in your own applications.

계산이 빠르고 무염, 그것은 매우 보안 해제한다 : 문서에서. 대신 해싱을 서버 측 언어로두고 BCrypt, PBKDF2 또는 SCrypt와 같은 비용 요소가있는 느린 해시 함수를 사용하는 라이브러리를 사용하십시오. 잘 알려진 Java 용 라이브러리는 jBCrypt입니다.

관련 문제