티스토리 뷰

프로그래밍/SQLite3

암호화 저장하기

에어버스 2018. 10. 28. 15:01

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, NULLNULL&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, NULLNULL&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, NULLNULL&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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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