Blockchain und DSGVO müssen kein Widerspruch sein

Seite 2: Erster Baustein: Hashing

Inhaltsverzeichnis

Der erste Baustein ist das Hashen der Daten und das anschließende Speichern des Hashes in der Blockchain. Dadurch wird ein direktes Speichern der personenbezogenen Daten verhindert. Die Verwaltung kann genau wie bisher das Unternehmen selbst "off-chain" übernehmen. Ein Hash ist als Fingerabdruck einer Datei oder einer beliebigen anderen Zeichenabfolge zu verstehen. Es wurde eine kryptografische Hashfunktion mit entsprechend höherer Garantie für ihre Sicherheit benutzt. Zusätzlich sieht der Hash schon bei kleinsten Abweichungen in der Zeichenkette vollkommen anders aus. Aufgrund der guten Unterstützung im Ethereum-Ökosystem kam hier die Hashfunktion Keccak-256 zum Einsatz.

Da auch die weiteren Teile der Implementierung fortwährend einen Hash mit der gleichen Länge in die Blockchain schreiben, lässt sich immer der gleiche Contract benutzen. Er könnte alle Aufgaben übernehmen, die auch eine herkömmliche Ethereum-Identität unterstützt, nur eben nicht in Form einer Adresse, sondern als Hash. Ein Beispiel-Contract, der nur Kontostände für Kunden führt, könnte beispielsweise wie folgt aussehen:

// Legt die Compilerversion fest
pragma solidity 0.5;

// Deklariert den Smart-Contract Sparbuch
contract Sparbuch {

// Adresse des Besitzers, dient der Rechteverwaltung
address owner;

// Beinhaltet alle Kontostände der durch Hashes referenzierten Kunden, public erzeugt automtisch eine Getter-Methode für die Variable
mapping(bytes32 => uint256) public balances;

// Beinhaltet alle registrierten Kunden
mapping(bytes32 => bool) public registered;

// Beim Erstellen des Contracts wird der Ersteller als Besitzer festgelegt
constructor() public {
owner = msg.sender;
}

// Verhindert, dass bestimmte Funktionen durch fremde Adressen aufgerufen werden können
modifier onlyOwner() {
require(owner == msg.sender);
_;
}

// Verhindert, dass bestimmte Funktionen für nicht registrierte Kunden aufgerufen werden können
modifier isRegistered(bytes32 _client) {
require(registered[_client]);
_;
}

// Verändert den Kontostand eines bestimmten Kunden
function addValue(bytes32 _client, uint256 _value) public
onlyOwner isRegistered(_client) {
uint256 newBalance = balances[_client] + _value;
// Stellt sicher, dass kein Overflow passieren kann
require(newBalance >= balances[_client]);
balances[_client] = balances[_client] + _value;
}

// Verändert den Kontostand eines bestimmten Kunden
function deductValue(bytes32 _client, uint256 _value) public
onlyOwner isRegistered(_client) {
// Stellt sicher, dass kein Overflow passieren kann
require(balances[_client] >= _value);
balances[_client] = balances[_client] - _value;
}

// Registriert einen neuen Kunden
function registerClient(bytes32 _client) public
onlyOwner {
registered[_client] = true;
}
}

Hier nun ein Beispiel für das Erstellen eines Hashes mit anschließender Sicherung in der Blockchain:

// Nutzt die web3-Bibliothek, zu installieren mit: npm i web3
const web3 = require('web3')

// Importiert Informationen wie ABI und Adresse eines Smart Contract, mit dem interagiert werden soll
const contractData = require('path/to/abi')

// Die personenbezogenen Daten, auf die die Referenz gebildet werden soll
let value = 'Max Mustermann, 01577123456, Musterstraße 42, 04321 Musterstadt'

// Das Hashen der Daten
// Hier lautet der Hash: 0x168eaaa61a5a7ff7e59880cbbb7d23e9267b8b7b96cd9a4a5e7dfd7f5e2a301d
let hashedValue = web3.utils.sha3(value)

// Erstellt einen web3 Provider, der eine Verbindung zur Blockchain über einen lokalen Node hat
let web3Connection = new web3("ws://localhost:8546")

// Erstellt ein Contract-Objekt, mit dem interagiert werden kann
let contract = new web3Connection.eth.Contract(contractData.abi, contractData.address)

contract.methods.registerClient(hashedValue).send()
.then((result)=>{
if(result.status === true){
// Speichern des Hashes in die Blockchain war erfolgreich, jetzt könnte eine lokale Datenbank aktualisiert werden
} else {
// Es gab ein Problem im Contract, d.h., der Hash wurde nicht gespeichert, aber die Transaktion ist in der Blockchain angekommen, es muss entsprechend mit dem Fehler umgegangen werden
}
})
.catch((error)=>{
// Der Hash wurde nicht gespeichert, es ist ein Fehler aufgetreten, Grund dafür könnte zum Beispiel eine fehlerhafte Verbindung zur Blockchain sein, es muss entsprechend mit dem Fehler umgegangen werden
})