SQLite 데이터베이스 암호화

LiteSync는 SQLite 데이터베이스의 암호화와 노드 간의 통신 기능을 함께 제공

이용 가능한 암호는 소형 기기에서 AES보다 빠른 차차(ChaCha)와 더 빠른 RC4 확장 버전인 XRC4다.

암호화된 데이터베이스를 열려면 URI 매개변수 암호 또는 헥스 키를 사용하십시오. 예:

"file:/path/to/file.db?cipher=...&key=..."

또는

"file:/path/to/file.db?cipher=...&hexkey=..."


암호

암호 인수는 다음 값 중 하나로 설정할 수 있다:

xrc4 - 최빠른 속도
chacha8 - 빠른 속도
chacha12 - 중간
chacha20 - 최강



XRC4를 사용하면 키가 최대 256바이트가 될 수 있다. 예:

"file:data.db?cipher=xrc4&key=testing"

차차를 사용하면 키가 32바이트가 되어야 한다. 예:

"file:data.db?cipher=chacha20&key=ThisIsAReallyLongKeyWith32Bytess"

또한 키는 헥스형 매개 변수를 사용하여 1hexkey 형식일 수 있다:

"file:data.db?cipher=...&hexkey=11223344556677889900AABBCCDDEEFF..."


암호화된 데이터베이스 만들기

위와 같은 URI로 데이터베이스를 연 다음 테이블을 만들어 채운다.



기존 데이터베이스 변환

현재는 기존 데이터베이스를 직접 변환할 수 없다. 우리는 SQLite 셸을 사용하여 암호화된 데이터베이스를 생성한 후 일반 데이터베이스의 데이터를 복사해야 한다.

이 작업은 단 한 번의 작업으로 수행할 수 있다:

sqlite3 plain.db .dump | sqlite3 "file:encrypted.db?cipher=...&key=..."

또는 생성된 SQL 명령을 검사하려는 경우 2단계:

sqlite3 plain.db .dump > out.sql

sqlite3 "file:encrypted.db?cipher=...&key=..." < out.sql

기본값과 다른 페이지 크기를 사용하려면 생성된 out.sql 파일을 열고 맨 위에 실용주의 줄을 추가하십시오:

PRAGMA page_size=...;

주의: 이 암호화된 데이터베이스 파일은 기본 노드에서만 사용해야 한다. 연결이 설정되면 보조 노드가 기본 노드에서 이 파일을 다운로드한다.



데이터베이스 헤더

SQLite 데이터베이스의 처음 100바이트는 헤더를 형성한다. 대부분은 고정된 데이터다.

암호화에서 일반 데이터를 알고 있으면 공격자가 암호화 키를 검색하는 데 도움이 된다.

이러한 이유로 데이터베이스 헤더는 기본적으로 암호화되지 않지만 총 3가지 옵션이 있다:


1. 데이터베이스 헤더 암호화 안 함

이것은 기본 동작이다


2. 데이터베이스 헤더를 암호화하지 않고 사용자 정의 헤더 문자열을 사용하십시오

헤더의 처음 16바이트는 헤더 문자열을 형성한다. 기본 헤더 문자열은 "SQLite 형식 3"(null terminator 포함)이다.

어떤 이유로 파일이 SQLite 데이터베이스임을 명확히 하지 않으려는 경우 이 문자열을 변경할 수 있다.

사용자 정의 헤더를 사용하여 LiteSync를 컴파일하려면:

CODEC_USE_CUSTOM_HEADER

CODEC_CUSTOM_HEADER="ExampleNewHeader"

사용자 정의 헤더 문자열의 길이는 15바이트 또는 16바이트여야 한다. 15바이트를 사용할 경우 마지막 바이트는 Null 종단기가 된다.


3. 데이터베이스 헤더를 암호화하되, 데이터베이스 헤더에서 16-23 바이트를 암호화하지 마십시오

이러한 바이트는 SQLite에서 암호화되지 않도록 요구된다.

데이터베이스 헤더를 암호화하려면 다음을 사용하여 LiteSync 컴파일:

CODEC_ENCRYPT_DB_HEADER



내부 디자인

각 페이지는 온디맨드 방식으로 암호화되어 해독되며, 각 페이지에는 고유의 초기화 벡터(nonce)가 있다. 페이지가 저장될 때마다 새로운 IV가 사용되며, 그러면 전체 암호화된 페이지 데이터가 이전과 달라진다.

WAL 페이지도 암호화되어 있다.

노드 간의 통신은 데이터베이스에 대해 선택된 것과 동일한 암호와 키를 사용한다. 각 메시지는 다른 초기화 벡터를 사용하므로 동일한 일반 데이터가 다른 암호화 스트림으로 전송된다.