Enable Javascript


Last Arduino/ESP project (click to open)
Ster inactiefSter inactiefSter inactiefSter inactiefSter inactief
 

Artikelindex

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