modPasswordDB
modPasswordDB:
Dit is, wat database betreft, een heel erg simpele module. Eerder zagen we al dat Database, Connection, DataSet, Adapter, DataTable, BindingSource met Event noodzakelijk zijn. Ik geef geen uitleg over deze standaard componenten, dat weet je vast al wel en anders zoek het even op. Extra een DataRow per tabel welke steeds automatisch wordt gevuld vanuit het geselecteerde record en zo eenvoudig is uit te lezen. Gebruikt ze ook voor het kopiëren van ongewijzigde waarden in queries. Enkele van deze componenten zijn als Public en anderen als Private gedeclareerd. Je ziet dus gelijk welke je ook buiten deze module kunt benutten.
Bestand of velden versleutelen?
Een heel bestand versleutelen maakt het bestand maar iets groter. Losse velden versleutelen kost veel ruimte (kijk bij Password en SubKey). Dus waarom zou je voor het laatste kiezen? De data uit een versleuteld bestand komt onversleuteld in het geheugen te staan en is met een geheugendump leesbaar te maken. Daarentegen staan versleutelde velden ook versleuteld in het geheugen en ontsleutel je ze alleen op het moment dat het noodzakelijk is. Het is dus een kwestie van welk beveiligingsniveau gewenst is.
Heb je de Database met een wachtwoord beveiligd?
In dat geval moet je eerst het database-wachtwoord laten ingeven voor je de Function InitDb() aanroept. En in InitDb() de Connection.ConnectionString aanpassen:
Public myDbPassword as String ="; Password=" & Me.txtDbWachtwoord.Text ' of via InputBox Connection.ConnectionString = "Data Source=" & DbPath & DbFile & myDbPassword
Indien InitDB waarde False geeft dan is myDbPassword fout. Er zijn voor het beveiligen met wachtwoord meer parameters beschikbaar, maar de default-waarden zijn SQLite voldoende en kun je, naar mijn ervaring, wel vergeten. Kijk bij SQLite-Help hoe achteraf met wachtwoord te beveiligen, of de beveiliging te verwijderen, het is nogal simpel te doen.
Let op de spaties aan het einde in de diverse query deel-regels!
Project NAW - modPasswordDB.vb
Imports System.Data.SQLite Module PasswordDB ' '' Het Password-record telt slechts één record en is als Public Module overal beschikbaar ' '' Taal-records, prog.waarden, .... kun je zo ook in deze/een Module stoppen ' '' Via een Sub-Clas wordt het BindingSourceTblPassword-Event doorgegeven, ' '' dat wordt hier niet gebruikt maar is wel als voorbeeld aanwezig ' '' Werkt zonder declaratie, verder net als Class NawDB #Region "Password" Public RowTblPassword As DataRow ' BindingSourceTblPassword.CurrentRecord voor uitlezen Private Connection As New SQLiteConnection ' de connectie met het DB-bestand Private DataSetDbNAW As DataSet = New DataSet() ' de set DB-tabellen Private AdapterTblPassword As SQLiteDataAdapter ' de adapter werkt direct met DB Private DataTableTblPassword As DataTable ' de lokale tabel Public WithEvents BindingSourceTblPassword As New BindingSource() ' binding vanuit DataTable #If DEBUG Then ' '' Wachtwoord: 0000 (4 x NUL) Private Sub PasswordEnSubKeyReset() ' '' Zet tijdens DEBUGen password op 0000 en reset de SubKey, wordt aanroepen vannuit InitDB ' '' zo genereer/herstel je de waarden van Password en SubKey in de Tabel Password Dim Password As String = "0000" Dim PasswordEncrypt As String = Encrypt(Password, Password) Dim SubkeyEncrypt As String = Encrypt("p|+I]{+IK3u%XqV+8|7h>%<e", Password) If PasswordUpdate(RowTblPassword("ID"), PasswordEncrypt, SubkeyEncrypt) Then _ AdapterTblPasswordUpdate() ' gelijk in DB opslaan End Sub #End If Public Function InitDB() As Boolean Dim i As Integer Connection.ConnectionString = ConnectionString Connection.Open() AdapterTblPassword = New SQLiteDataAdapter("SELECT * FROM tblPassword", Connection) i = AdapterTblPassword.Fill(DataSetDbNAW, "tblPassword") DataTableTblPassword = DataSetDbNAW.Tables("tblPassword") BindingSourceTblPassword.DataSource = DataTableTblPassword If i <> 1 Then Return False ' geen, of meer dan één, tblPassword record #If DEBUG Then PasswordEnSubKeyReset() ' uitschakelen met ' (REM) #End If Return True End Function Public Sub CloseDB() Try Dim i As Integer i = AdapterTblPasswordUpdate() Connection.Close() BindingSourceTblPassword.Dispose() DataTableTblPassword.Dispose() AdapterTblPassword.Dispose() DataSetDbNAW.Dispose() Connection.Dispose() Catch ex As Exception End Try End Sub Public Function AdapterTblPasswordUpdate() As Integer Dim cmdBuilder As SQLiteCommandBuilder cmdBuilder = New SQLiteCommandBuilder(AdapterTblPassword) Return AdapterTblPassword.Update(DataSetDbNAW, "tblPassword") End Function Sub BindingSourcePassword_CurrentChanged(ByVal sender As Object, ByVal e As EventArgs) _ Handles BindingSourceTblPassword.CurrentChanged ' '' vult, na wijzigen van SelectedIndexChange, RowPassword met het huidige record ' '' roept sub-"Class BindingSourcesClass" op om een Event door te geven aan andere Classes (Forms) If BindingSourceTblPassword.Count > 0 Then ' '' CType() tegen Late Binding Error in Mobile RowTblPassword = CType(BindingSourceTblPassword.Current, DataRowView).Row End If ' ''####### voorbeeld MODULE-Event BindingSourcesEvents.BSPassword() 'Event doorgeven via sub-Class-Event End Sub #End Region ' Password ' '' Alleen Select * en Update nodig ' '' Zie clsNawDB voor info "Acties via DataSet" en "Acties via SQL statements" #Region "Acties via DataSet" Public Function PasswordUpdate(ByVal ID As Integer, ByVal Password As String, _ ByVal SubKey As String) As Boolean ' '' in dit geval het enigste record Updaten ' '' LET OP!!!! voordat je een nieuw versleuteld wachtwoord ingeeft: ' '' SubKey moet eerst met het OUDE wachtwoord worden ontsleuteld en ' '' met het NIEUWE wachtwoord versleutelen en dan pas het oude wachtwoord vervangen ' '' Natuurlijk kan dat hier ook maar ik geef er de voorkeur aan ' '' om het buiten deze module te houden Dim i As Boolean = True Try Dim row As DataRow = DataTableTblPassword.Select("ID = '" & ID & "'")(0) row("Password") = Password row("SubKey") = SubKey Catch ex As Exception i = False End Try Return i End Function #End Region ' Acties via DataSet #Region "Acties via SQL statements" Public Function PasswordSelectSQL() As Integer ' '' in dit geval het enigste record Selecteren ' '' return: -1 niet uitgevoerd, >=0 gelukt Dim Query As String = "SELECT * FROM tblPassword" Dim i As Integer = 0 Try AdapterTblPassword.SelectCommand.CommandText = Query DataTableTblPassword.Clear() i = AdapterTblPassword.Fill(DataTableTblPassword) Catch ex As Exception i = -1 End Try Return i End Function #End Region ' Acties via SQL statements #Region "RaiseEvent-BindingSourcesClass" ' ''####### voorbeeld MODULE-Event Public BindingSourcesEvents As New BindingSourcesClass Public Class BindingSourcesClass ' '' geeft Events door Public Shared Event BSPasswordCurrentChanged(ByVal count As Integer) Public Sub BSPassword() ' deze is eigenlijk niet nodig daar er maar één record is RaiseEvent BSPasswordCurrentChanged(BindingSourceTblPassword.Count) End Sub End Class #End Region ' RaiseEvent-BindingSourcesClass End Module