Clever-Excel-Forum

Normale Version: Änderungen in xl-Ranges erkennen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

im Rahmen der Analysen des APT-Agriffs auf "SolarWind" und deren Kunden wurde auf einen Fowler_Noll_hash hingewiesen. In VBA ist nicht direkt nutzbar (Varibalen ans "unsigned 32-bt Interger), aber mit viel Übersetzungen kann man eine Prüfsummer für Excel-Ranges konstruieren.

Scenario: Eine Datei mit vertrulichen Daten wird weiter gegeben und unauthorisierte Änderungen sollen bemerkt werden.

Der Makro "Anlegen" erstellt so etwas wie einen Hash für die selektiereten Zellen. Eine Änderung wird später wird "Pruefen" erkannt:

Code:
'Range selektieren: Anlegen
' angeregtdurch Fowler_Noll_hash

Sub Anlegen()
Names.Add("A_" & ThisWorkbook.Names.Count, Selection, False).Comment = iHash(Selection)
Selection.Name = Names(Names.Count).Name
Names(Names.Count).Visible = False
End Sub

Sub Pruefen()
Dim NM As Name
For Each NM In Names
    If iHash(Range(NM)) <> NM.Comment Then Range(NM).Interior.Color = vbYellow
Next NM
End Sub

Function iHash(rng)
    hs = 111
    For Each c In rng
        Tx = Tx & c
    Next c
    
    For b = 1 To Len(Tx)
        hs = hs Xor Asc(Mid(Tx, b, 1))
    Next b
    iHash = hs
End Function

Sub Test()
Dim NM As Name
Debug.Print
For Each NM In Names
    Debug.Print NM.Name, NM, NM.Comment
    'NM.Delete
Next NM
End Sub

By-the-way: Das Anlegen von NAMES erstellt manchmal im xlA1, manchmal im Format xlRC, sehr unangenehm.

Der Ansatz ist nicht kryptographisch sicher, aber auch nicht so leicht zu finden. Wenn ein Verdacht auf Manipulation besteht, kann eine xlsx-Datei mit dem Code geprüft werden.

mfg
1. Schicke Sache, auch für Privatleute! Warum nicht sicher? Wenn Absender und Empfänger die Prüfsumme getrennt voneinander ermitteln können ... Ein Korrumpator könnte natürlich die Daten bei Kenntnis des Prüfprogramms entsprechend manipulieren.

2. RC1, RC2 ... sind seit xl2007 doppeldeutig, nämlich ein Bezug in R1C1- und A1-Schreibweise. Es wird vom Default R1C1- dann in A1-Schreibweise umgedeutet. Abhilfe: RC1 in der VBA-Default-Schreibweise (R1C1) immer als R[0]C1 schreiben.