2013-05-13 2 views
1

jacept를 사용하여 ssn 필드가 암호화 된 Employee 엔티티가 있습니다. 다음은 모의 정의입니다.jasypt에서 명명 된 쿼리를 사용하여 엔티티를 가져올 수 없습니다.

@TypeDef(name = "encryptedString", typeClass = EncryptedStringType.class, parameters = {@Parameter(name = "encryptorRegisteredName",value = "strongHibernateStringEncryptor")}) 
@Entity 
@Table(name="employee") 
@NamedQueries(value = { 
    @NamedQuery(name = "employee.getEmployeeBySSN", query = "SELECT employee from Employee employee WHERE employee.ssn=:ssn"), 
    @NamedQuery(name = "employee.getEmployeeByName", query = "SELECT employee from Employee employee WHERE employee.name=:name") 
    }) 
public class Employee { 

    @Id @GeneratedValue 
    private Long id; 

    private String name; 

    @Type(type = "encryptedString") 
    private String ssn; 
} 

이 엔티티에는 이름을 지정하고 다른 하나는 ssn을 갖는 두 개의 이름 지정된 쿼리가 있습니다. SSN 필드는 jasypt를 사용하여 암호화됩니다.

public static void main(String[] args) throws SerialException, SQLException { 

    //Configure jasypt encryptor 
    PooledPBEStringEncryptor strongEncryptor = new PooledPBEStringEncryptor(); 
    strongEncryptor.setAlgorithm("PBEWITHMD5ANDDES"); 
    strongEncryptor.setPassword("jasypt"); 
    strongEncryptor.setPoolSize(2); 

    //Register it with hibernate 
    HibernatePBEEncryptorRegistry registry = HibernatePBEEncryptorRegistry.getInstance(); 
    registry.registerPBEStringEncryptor("strongHibernateStringEncryptor", strongEncryptor); 

    //Get an entity manager factory 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("helloworld"); 

    //Get an entity manager 
    EntityManager em = emf.createEntityManager(); 
    EntityTransaction tx = em.getTransaction(); 
    tx.begin(); 

    //Create an employee 
    Employee employee = new Employee(); 
    employee.setName("Vaibhav"); 
    employee.setSsn("1234567"); 
    em.persist(employee); 

    tx.commit(); 

    EntityTransaction newtx = em.getTransaction(); 
    newtx.begin(); 

    //Search an employee with ssn 
    Query queryObject1 = em.createNamedQuery("employee.getEmployeeBySSN"); 
    queryObject1.setParameter("ssn", "1234567"); 

    //No results here 
    List employees1 = queryObject1.getResultList(); 

    newtx.commit(); 
    em.close(); 

} 

내가 employees1 목록에 결과를 얻을 : 코드 나는 다음과 같은 기본 구성을 사용하고, 따라서 모의 구현입니다. 그러나 다음과 같은 명명 된 쿼리를 실행하면 employee 객체에서 해독 된 ssn을 볼 수 있습니다.

Query queryObject = em.createNamedQuery("employee.getEmployeeByName"); 
queryObject.setParameter("name", "Vaibhav"); 
List employees = queryObject.getResultList(); 
Employee employee1 = (Employee)employees.get(0); 

내 코드에 버그가 있는지 또는 최대 절전 모드가 작동해야하는지 이해할 수 없습니다. 암호화가 최대 절전 모드 사용에 제한을 설정

:하지만 문서 Integrating Jasypt with Hibernate 3.x or 4.x에서 , 것을 기록 보안 표준이 동일한 데이터에 대한 두 개의 서로 다른 암호화 작업으로 인해 (같은 값을 반환하지 않도록 설정 무작위 소금의 사용). 이 때문에 지속될 때 으로 암호화 된 필드는 사용자가 속한 엔터티에 대한 검색 쿼리의 WHERE 절의 일부가 될 수 없습니다.

따라서 암호화 된 필드에서 검색 작업을 수행 할 수 없다는 의미입니다.

답변

1

난염 생성기를 사용하고있었습니다. 제로 염 생성기를 추가 한 후 문제를 해결할 수있었습니다.

strongEncryptor.setSaltGenerator(new ZeroSaltGenerator()); 
관련 문제