티스토리 뷰
SQLite 암호화 기능은 유료라서 무료버전에서는 지원안된다.
MFC로 암호화해서 저장하는데, Binary로 저장되기에 TEXT 로 저장하면 복호화때 실패하므로, 필드 속성은 BLOB 으로 지정한다.
BLOB 저장할떄는 TRANSACTION 으로 처리해야만 한다.
암호화/복호화는 MFC에서 처리한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 |
sqlite3* pDB;
char* pErr;
char **results = NULL;
CString strErrMsg, strSQL = NULL;
int nResult = sqlite3_open(_DB로그인파일, &pDB);
if (nResult)
{
strSQL = sqlite3_errmsg(pDB);
AfxMessageBox(TEXT("DB를 열지 못했습니다.\r\n") + strSQL);
return FALSE;
}
strSQL = TEXT("CREATE TABLE IF NOT EXISTS Option ( \
AutoLogin TEXT DEFAULT NULL, \
LoginID BLOB NOT NULL \
);"
);
nResult = sqlite3_exec(pDB, strSQL, NULL, NULL, &pErr);
if (nResult)
{
strSQL = pErr;
AfxMessageBox(TEXT("SQLite 테이블을 만들기 실패 :\r\n") + strSQL);
sqlite3_free(pErr);
sqlite3_close(pDB);
return FALSE;
} |
cs |
테이블 구조는 위 코드와 같이 암호화 하는 LoginID 는 BLOB 이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 |
CString strSQL_BEGIN = TEXT("BEGIN TRANSACTION");
CString strSQLcommit = TEXT("COMMIT TRANSACTION");
int nResult = sqlite3_open(_DB로그인파일, &pDB);
if (nResult)
{
strSQL = sqlite3_errmsg(pDB);
AfxMessageBox(TEXT("1 : DB를 열지 못했습니다.\r\n") + strSQL);
return FALSE;
}
nResult = sqlite3_exec(pDB, strSQL_BEGIN, NULL, NULL, &pErr);
if (nResult != SQLITE_OK)
{
CString str(sqlite3_errmsg(pDB));
AfxMessageBox(TEXT("1 : BEGIN TRANSACTION Failed!!!\n\r") + str);
}
CString str;
if (theApp.GetDB초기화Flag() == TRUE) // 처음등록
strSQL = TEXT("INSERT INTO Option VALUES ( ?1, ?2 ); ");
else // 수정
strSQL = TEXT("UPDATE Option SET LoginID=?2 WHERE AutoLogin=?1 ;" );
nResult = sqlite3_prepare_v2(pDB, strSQL, strSQL.GetLength(), &stmt, NULL);
if (nResult != SQLITE_OK)
{
CString str(sqlite3_errmsg(pDB));
AfxMessageBox(TEXT("1 : PrepareV2 Failed!!!\n\r") + str);
sqlite3_finalize(stmt);
sqlite3_free(pErr);
sqlite3_close(pDB);
}
CString str암호화ID = 암호화(m_strRegID);
nResult = sqlite3_bind_text(stmt, 1, m_strReg자동로그인, m_strReg자동로그인.GetLength(), SQLITE_STATIC); // AutoLogin
nResult = sqlite3_bind_blob(stmt, 2, str암호화ID, str암호화ID.GetLength(), SQLITE_STATIC);
/*
7) 데이터 삭제
sqlite3_stmt* statement;
char* sql = "DELETE FROM myTable WHERE no=";
if( sqlite3_prepare_v2(database, sql, -1, &statement, NULL ) == SQLITE_OK )
{
sqlite3_bind_int( statement, 1, No );
if( sqlite3_step(statement) != SQLITE_DONE ) {
NSLog( @"sqlite3_step error" );
}
}
*/
if (sqlite3_step(stmt) != SQLITE_DONE)
{
CString str;
str.Format(TEXT("1 : Error message: %s\n"), sqlite3_errmsg(pDB));
AfxMessageBox(str);
}
sqlite3_reset(stmt);
sqlite3_finalize(stmt); // Commit 하기전에 해제해야 한다. 안그러면 더미 데이터 생기는듯....
nResult = sqlite3_exec(pDB, strSQLcommit, NULL, NULL, &pErr);
if (nResult != SQLITE_OK)
{
CString str(sqlite3_errmsg(pDB));
AfxMessageBox(TEXT("1 : Commit TRANSACTION Failed!!!\n\r") + str);
}
sqlite3_free(pErr);
sqlite3_close(pDB); |
cs |
SELECT 문도 TRANSACTION 처리로 준비코드는 위 코드 참조하고....
1
2
3
4
5
6
7
8
9
10
11
12
13 |
strSQL.Format(TEXT("SELECT * FROM Option WHERE AutoLogin = '%s';"), str);
if (sqlite3_prepare_v2(pDB, strSQL, -1, &stmt, NULL) == SQLITE_OK)
{
if (sqlite3_step(stmt) == SQLITE_ROW) //while (sqlite3_step(stmt) == SQLITE_ROW)
{
chData[0] = (TCHAR*)sqlite3_column_text(stmt, 0); // AutoLogin
chData[1] = (TCHAR*)sqlite3_column_blob(stmt, 1);
m_strReg자동로그인 = chData[0];
m_strRegID = 복호화(chData[1]);
}
}
sqlite3_reset(stmt);
sqlite3_finalize(stmt); // Commit 하기전에 해제해야 한다. 안그러면 더미 데이터 생기는듯.... |
cs |