Class CryptTable() Professional
Class function of the CryptTable() class
The CryptTable class manages encryption and decryption of database tables. A database table is encrypted by specifying the encryption type and which key to use. The key must be retained in a safe place and is required to open the table after closing. It is also required to use the same CryptProvider, of course.
Data is encrypted record-wise using the operation mode CBC/CTS by default. This mode requires an additional field to store the initialization vector (IV), which is a prerequisite for CBC. The IV is filled with random data, and serves as the first block to be XOR'ed with the following data block. This enhances the level of security for records containing data with minor differences, such as customer numbers, timestamp fields etc. It also prevents the record from being falsified by exchanging a block.
The method :setupStruct()will adapt a given table structure to comply with the encryption mode. If the length of the record is less than 1 block length, it will be extended.
SecureKey():destroy() can be called right after passing the key object.
// Open a table and encrypt data
#include "crypt.ch"
PROCEDURE MAIN(cKey)
LOCAL oKey
LOCAL oCryptedDbf
LOCAL aTarStruct
// Load FOXCDX DatabaseEngine as it is required
DbeLoad("FOXDBE")
DbeLoad("CDXDBE")
DbeBuild("FOXCDX","FOXDBE","CDXDBE")
// use default key
IF(cKey==NIL)
cKey := "A5:25:11:DA:1C:5C:72:9A:C9:78:03:FD:65:DF:0A:32"
ENDIF
// setup secure key object
oKey := SecureKey():new()
oKey:setStrKey(cKey)
// create a CryptTable()-instance
oCryptedDbf := CryptTable():new(,oKey)
// destroy key instance
oKey:destroy()
// open source table
USE customer NEW VIA DBFNTX
aTarStruct := oCryptedDbf:setupStruct(,"FOXCDX")
// create and open new table
DbCreate("crypted", aTarStruct)
USE crypted NEW ALIAS secure
// enable automatic encrypting/decrypting for workarea
oCryptedDbf:enable()
DO WHILE !customer->(eof())
secure->(DbAppend())
FOR i:= 1 TO customer->(Fcount())
secure->(FieldPut(oCryptedDbf:fieldOffset+i, customer->(FieldGet(i))))
NEXT
customer->(dbskip())
ENDDO
// disable automatic encrypting/decrypting
oCryptedDbf:disable()
CLOSE ALL
RETURN
// Open a encrypted table using a given key
#include "crypt.ch"
PROCEDURE MAIN(cKey)
LOCAL oKey
LOCAL oCryptedDbf
LOCAL aTarStruct
// Load FOXCDX DatabaseEngine as it is required
DbeLoad("FOXDBE")
DbeLoad("CDXDBE")
DbeBuild("FOXCDX","FOXDBE","CDXDBE")
// use default key
IF(cKey==NIL)
cKey := "A5:25:11:DA:1C:5C:72:9A:C9:78:03:FD:65:DF:0A:32"
ENDIF
oKey := SecureKey():new()
oKey:setStrKey(cKey)
// create a CryptTable()-instance
oCryptedDbf := CryptTable():new(,oKey)
// destroy key instance
oKey:destroy()
// crypted tables are automatically detected
USE crypted NEW ALIAS secure
oCryptedDbf:enable()
Browse()
CLOSE ALL
RETURN
// In this example, a new table is filled with data
// using encryption
#include "crypt.ch"
PROCEDURE MAIN()
LOCAL oKey
LOCAL oCryptedDbf
LOCAL aTarStruct
oKey := SecureKey():generate()
? "Key:", oKey:toString(,":")
// create a CryptTable()-instance
oCryptedDbf := CryptTable():new(,oKey)
// destroy key instance
oKey:destroy()
aTarStruct := oCryptedDbf:setupStruct({{"ID", "C", 4, 0}, {"NAME", "C", 20, 0}}
,"FOXCDX")
DbCreate("crypted", aTarStruct)
USE crypted NEW ALIAS secure
// enable automatic encrypting/decrypting
oCryptedDbf:enable()
secure->(DbAppend())
secure->id := "0001"
secure->name := "Valentina Titowa"
secure->(DbAppend())
secure->id := "0002"
secure->name := "Natalya Sayko"
secure->(DbAppend())
secure->id := "0003"
secure->name := "Leonid Menaker"
// disable automatic encrypting/decrypting
oCryptedDbf:disable()
CLOSE ALL
RETURN
// Load FOXCDX DatabaseEngine as it is required
PROCEDURE DBESYS
DbeLoad("FOXDBE")
DbeLoad("CDXDBE")
DbeBuild("FOXCDX","FOXDBE","CDXDBE")
RETURN
If you see anything in the documentation that is not correct, does not match your experience with the particular feature or requires further clarification, please use this form to report a documentation issue.