2012-08-01 3 views
3

최근 내 프로젝트에서 나는 우리 데이터베이스에서 중복 검색을 위해 lucene을 사용했으며 완벽하게 작동하고 있습니다. 하지만 lucene 인덱스를 암호화해야하는 요구 사항이 있으며 외부 라이브러리를 사용하는 대신 lucene 자체에서 제공하는 암호화 기능을 찾아야합니다.lucene의 암호화 시설

방금 ​​LUCENE-2228 AES 암호화 된 디렉토리를 찾고 작은 POC를 만들었습니다.

public class indexing 
{ 
    private static final byte[] KEY = 
     new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't', 
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' }; 
    public static void main(String[] args) throws Exception 
    { 

     Directory INDEX_DIR = new AESDirectory(new File("index1"),KEY); 

     Connection conn=null; 

     SnowballAnalyzer analyzer=new SnowballAnalyzer(Version.LUCENE_30,"English"); 
     try 
     { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      conn = DriverManager.getConnection("jdbc:mysql:///lucene", "abcd", "abcd"); 
      IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, analyzer); 
      IndexWriter writer = new IndexWriter(INDEX_DIR, config); 
      writer.deleteAll(); 
      //writer.flush(); 
      System.out.println("Indexing to directory '" + INDEX_DIR + "'..."); 
      long starttime=System.currentTimeMillis(); 
      indexDocs(writer, conn); 
      writer.optimize(); 
      writer.close(); 
      long endtime=System.currentTimeMillis(); 
      long timetaken=TimeUnit.MILLISECONDS.convert(endtime - starttime,TimeUnit.MILLISECONDS); 
      System.out.println("Time taken to do indexing is "+timetaken+"ms"); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    static void indexDocs(IndexWriter writer, Connection conn) throws Exception 
    { 
     //String sql = "select qid,question from tblquestions"; 
     String sql = "select qid,question from tblquestions"; 
     Statement stmt = conn.createStatement(); 
     stmt.setFetchSize(Integer.MIN_VALUE); 
     ResultSet rs = stmt.executeQuery(sql); 
     Integer count = 0; 
     while (rs.next()) 
     { 
      count ++; 
      Document d = new Document(); 
      d.add(new Field("qid", rs.getString("qid"), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
      d.add(new Field("question", rs.getString("question"), Field.Store.YES, Field.Index.ANALYZED)); 
      writer.addDocument(d); 
     } 
     System.out.println("count: " + count); 
    } 
} 

아무도 나에게이 문제를 해결하는 데 도움을 줄 수 :

java.lang.RuntimeException: File already Exists 
    at org.apache.lucene.util.AESWriter.<init>(AESWriter.java:117) 
    at org.apache.lucene.store.AESDirectory$AESIndexOutput.<init> 
     (AESDirectory.java:187) 
    at org.apache.lucene.store.AESDirectory.createOutput(AESDirectory.java:72) 
    at org.apache.lucene.index.SegmentInfos.finishCommit(SegmentInfos.java:939) 
    at org.apache.lucene.index.IndexWriter.finishCommit(IndexWriter.java:3539) 
    at org.apache.lucene.index.IndexWriter.commitInternal(IndexWriter.java:3529) 
    at org.apache.lucene.index.IndexWriter.closeInternal(IndexWriter.java:1879) 
    at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1822) 
    at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1786) 
    at org.apache.lucene.test.indexing.main(indexing.java:45) 

것은 여기 내 코드입니다 : 문제는 내가 다시 인덱싱을 할 때이 오류가 다음 얻을 수 있다는 것입니다. 또는 lucene 색인의 암호화에 대해 알아보십시오.

+0

어떤 lucene 버전을 사용하고 있습니까? AESDirectory를 작동 시키셨습니까? – Rocky

+1

전체 파일 시스템을 암호화하는 것을 고려 했습니까? –

+0

아니면 적어도 암호화 된 FS/컨테이너/오버레이를 Lucene 색인 디렉토리에 마운트 하시겠습니까? –

답변

0

패치는 버전 3.1 용이며 다른 버전의 Lucene을 사용하고있는 것으로 보입니다. 버전에 대한 패치가 밖으로까지 다음 대안 중 하나를 선택 (또는 당신의 자신의 패치를 쓰기!) 루씬 3.1

  • Windows를 사용하여 NTFS 암호화에

    1. 전환합니다. 권한이없는 사람이 색인을 만든 사용자로 로그인하는 방법을 모르는 경우가 아니면 안됩니다.

    2. TrueCrypt 또는 다른 외부 암호화를 계속 사용하십시오. 이것은 매우 안전해야하지만 암호화 된 드라이브를 설치하려면 TrueCrypt 및 관리 권한을 설치해야합니다.