데이터베이스 개발자 질문과 답변 게시판
주민등록번호 필드를 varbinary로 잡고 인덱스를 생성하려고 하는데 오류가 발생됩니다.
보아하니 varbinary타입은 인덱스가 생성이 안되는 것으로 보입니다.
정말 그러한지요?
create index idx_enc2 on TableA(id)
메시지 1919, 수준 16, 상태 1, 줄 1
테이블 'TableA'에 있는 열 'id'의 유형이 인덱스에서 키 열로 사용하기에 적합하지 않습니다.
주민번호를 암호화하기 위해 varbinary로 잡은 것입니다.
감사합니다..
Comment 4
-
김시준
2013.02.22 09:15
예.. 감사합니다.
답변 내용에 대해 저도 기본적으로는 이해를 합니다. 저도 그런 생각이었으니까요...
자세히 얘기하기는 그렇지만 저희 암호화 솔루션을 개발했는데 OPE(순서유지 암호화) 방식이라 전체를 복호화 할 필요가 없는 제품입니다.
그래서 where에서 조건만 암호화하여 검색만 하면 되며, 인덱스가 있다면 검색속도가 아주 빠르겠지요. 타 제품과는 달리 본 제품은 인덱스 생성이 가능합니다.
오라클에서는 암호화된 필드를 raw 타입으로 저장하여 인덱스를 생성하고 있습니다. 당연히 검색속도가 아주 좋습니다.
그런데 sql Server에서는 안되는군요... 혹시 방법이 없겠습니까?
차선책으로 include는 어떨까 생각도 해 봅니다.
조언을 구해보며 DB는 sql server 2005, 2008입니다.
감사합니다.
-
암호화 컬럼에 인덱싱이 가능하다는거는 인덱스의 리프레벨이 정렬되어 있다는 뜻이고
인덱스의 리프레벨이 정렬되어 있다는거는 그 자체로 암호화가 아님을 반증하는 것입니다.
오라클은 제가 써본일이 거의 없어서 드릴 말씀은 없네요.
혹시 그 제품 P% 제품인가요?
도입검토하다가 회사 모든 암호화는 SQL SERVER 고유 기능들을 이용해서 모두 자체 개발했습니다.
성능을 약간만 양보하면 암호화된 주민번호의 빠른 검색(인덱스만으로는 아니고)도 가능합니다.
-
김시준
2013.02.22 10:22
제품은 이번에 신규로 개발한 제품이라 아직 이름은 알려지지 않았습니다. E%입니다...
그리고 이유를 알았습니다.
인덱스가 안 걸리는 이유는 인덱스의 최대 사이즈가 900바이트이기 때문입니다. 그런데 varbinary(max)로 하니 인덱스의 길이를 초과해서
오류가 발생한 것입니다. varchar(max)도 마찬가지로 인덱스 생성이 안됩니다. 같은 이유로....
varbinary(900)으로 하면 문제없이 인덱스 생성이 잘 됩니다.....
인덱스, 그동안 무심코 사용해 왔었는데 최대 길이가 900이라는 것을 처음 알았습니다...
감사합니다...
varbinary는 왜 인덱스 컬럼이 될 수 없는가는... 잘 모르니까 패쓰
하지만 주민번호를 암호화해서 저장한 컬럼이라면 더더욱 인덱스를 생성할 필요가 없습니다.
인덱스 잡아봐야 소용이 없죠.
암호화된 주민번호 컬럼에서 특정 주민번호를 찾으려면 복호화를 해야 하는데
그렇다면 전체 주민번호 컬럼을 복호화하기 전엔 원하는 값을 찾을 수 없다는 것이고
이것이 인덱스의 개념과는 전혀 다른것이 되어 버리죠. (Hash는 논외)
일부 암호화 솔루션 중에 암호화된 컬럼도 인덱스 걸 수 있고 like 검색도 지원한다고 하는 제품들이 있는데
뜨거운 얼음물 같은 거라고 봅니다.