SQLite 프로젝트는 2000년에 시작된 이래 현재까지 소스가 오픈되어 있습니다.

누구나 소스를 살펴볼 수 있고, 빌드하여 사용할 수 있다.


버전이 올라가는 것만 봐도 프로젝트가 꾸준히 진행되는 것을 엿볼 수 있습니다.

불과 한 달 전(2015. 5. 20)에도 3.8.10.2 버전이 릴리스되었습니다.


이러한 프로젝트를 15년이 넘게 '무료'로 운영하긴 힘들겁니다.

생업이란 것이 있고 가정도 있을테니 무일푼으로 개발하긴 쉽지 않죠.

SQLite 개발자는 현실적인 삶을 어떻게 유지하나 궁금했었는데 수익모델이 있었군요.



물론, SQLite 대부분의 기능은 무료입니다.

상용 플랫폼에 탑재하여 사용할 수도 있습니다.

프로그램 자체가 가볍고 정교하게 만들어졌는데 무료라니 사용을 마다할 이유가 없죠.


하지만, SQLite Encryption Extension(SEE) 부분은 오래 전부터 상용화를 위해 비워두었더군요.

DB의 기본적인 기능은 무료 기조를 유지하되,

고객정보노출에 대해 민감한 업체에는 암호화 부분을 판매하는 것이지요.

SQLite에는 아래처럼 SEE에 대한 홈페이지도 마련되어 판매를 촉진하고 있습니다.



위의 홈을 통해 SEE의 소스를 볼 수 있습니다.

다만, License를 구매한 사람만 볼 수 있지요.

SEE License 가격은 $2,000(대략 220만원)입니다.

http://www.hwaci.com/sw/sqlite/see.html?

SQLite를 구매할 정도로 넉넉한 살림살이가 아니기 때문에 라이센스 구매는 포기합니다.


대신 외부로 노출되어 있는 함수를 살펴보겠습니다.

구미가 당기시나요?


첫번째 함수는 DB를 암호화하거나 기존 암호를 변경할 때 사용합니다.


   int sqlite3_rekey_v2(
      sqlite *db,                    /* Database to be rekeyed */
      const char *zDbName,           /* Which ATTACHed database to rekey */
      const void *pKey, int nKey     /* The new key */
   );


1. 첫번째 인자는 db 커넥션을 의미합니다.

    sqlite3_open()으로 생성한 db 커넥션을 입력하면 됩니다.

2. zDBName은 Attach한 DB의 이름을 의미합니다.

    - 만약 Attach한 DB가 있으면,

      기존 db는 "main"(기존, NULL과 같음)이 되는 것이고,

      임시 db는 "temp"가 되겠지요.

      그 외에는 사용자가 직접 수행하는 ATTACH 명령어로 이름을 지정할 수 있습니다.

    - Attach한 DB가 없으면 그냥 NULL을 넣으면 되죠.

      (ATTACH에 대한 설명은 언젠가 기회가 되면 하겠습니다.)

3. 세번째에는 새로 설정할 키값을 넣습니다.

4. 네번째는 세번째 인자로 넣은 키값의 길이를 적으면 됩니다.

    strlen(pKey)하면 됩니다.


아래 순서로 사용하면 되겠군요~

sqlite3_open() → sqlite3_rekey_v2() → ... → sqlite3_close()


   int sqlite3_key_v2(
      sqlite3 *db,         /* The connection from sqlite3_open() */
      const char *zDbName, /* Which ATTACHed database to key */
      const void *pKey,    /* The key */
      int nKey             /* Number of bytes in the key */
   );


위의 함수가 암호가 걸린 db 파일을 복호화하는 함수입니다.

sqlite3_open() 함수로 db 파일을 연 직후에 수행해야 하지요.

암호가 걸린 파일은,

sqlite3_key_v2()로 복호화에 성공해야 db에 정상적으로 접근할 수 있습니다.


1. 위의 함수에서 db는 db 커넥션을 말합니다.

2. zDBName은 위에서 설명한 대로 Attach한 DB의 이름을 채워넣어줘야 합니다.

    NULL을 입력하면, 내부적으로 "main"에 해당하는 값이 설정되지요.

3. 세번째에는 암호를 풀 키값을 넣습니다.

4. 네번째는 세번째 인자로 넣은 키값의 길이를 적으면 됩니다.


sqlite3_open() → sqlite3_key_v2() → ... → sqlite3_close()

위와 같은 순서로 사용하게 됩니다.


다만 DB에 암호가 걸려있지 않다면 sqlite3_key_v2()를 사용할 필요는 없습니다.

기존에 걸린 암호를 없애려면,

sqlite3_rekey_v2(db, zDbName, NULL, 0);

위와 같이 설정하면 됩니다.


이처럼 새롭게 생성된 sqlite3_rekey_v2() 혹은 sqlite3_key_v2() 대신

PRAGRMA로 key, rekey 기능을 수행할 수 있습니다.


DB를 암호화하려면 sqlite3 shell에서 아래 명령어만 수행하면 됩니다.

sqlite> PRAGMA rekey="your_new_key";

암호를 풀려면 아래 명령어를 수행합니다.

sqlite> PRAGMA key="your_encryption_key";


sqlite> .rekey OLD NEW NEW

위의 명령어로 설정된 암호를 변경할 수 있습니다.

첫번째 인자가 예전키값이고, NEW/NEW는 신규키값입니다.

신규 키를 두 개 연달아 입력하는 이유는 비번 설정시 확인하는 절차를 주기 위해서입니다.


언제나 자본과는 무관할 줄 알았던 SQLite의 행보를 보니,

(사실 자본주의 시대에 자본과 무관하긴 힘들죠.

개발자로서 수익원을 창출한 SQLite에 갈채를 보냅니다.)

다음 수가 기대가 되기 시작합니다..


끝_


* References

http://www.hwaci.com/sw/sqlite/see.html?

http://www.sqlite.org/see/doc/trunk/www/readme.wiki

+ Recent posts