Anonimizacja danych – narzędzia skryptowe

Wyliczanie różnych funkcji skrótu dla całego bloku tekstu lub jego wybranych, wyróżnionych fragmentów, może okazać się pomocne wtedy, gdy trzeba wrażliwe dane poddać procesowi anonimizacji, czyli po prostu w nieodwracalny sposób je zaciemnić. Wówczas, jak zwykle z nieocenioną pomocą przychodzą narzędzia skryptowe.

Proces anonimizacji na dużą skalę przeprowadza się oczywicomputer.si_-685x320ście w trybie wsadowym na bazach danych lub na plikach tekstowych. Czasem jednak może zajść taka potrzeba, by anonimizować dane w trybie interakcyjnym, cały czas mając przed oczyma te informacje, które będą poddane zaciemnieniu.

Temu celowi służy skrypt, który dołączony jest do treści artykułu. Skrypt działa w trybie graficznym, a jego interfejs użytkownika został zbudowany w oparciu o bibliotekę GTK2.

Chcąc go użyć, do jego okienka tekstowego wklejamy tekst, na którym chcemy pracować, potem wybieramy rodzaj funkcji skrótu spośród dostępnych: MD5, SHA-1, SHA-2, (SHA-256) lub RIPEMD-160. Lista funkcji skrótu nie jest oczywiście zamknięta. Przez nieskomplikowaną modyfikację kodu można zaimplementować inne funkcje, jak na przykład: SHA-384 czy też SHA-512. Możliwa jest także implementacja wersji HMAC (Hashing Message Authentication Code), czyli wersji z kluczem, wszystkich dostępnych funkcji skrótu i uzyskania tym samym w programie funkcjonalności kryptograficznych sum kontrolnych. Po wybraniu funkcji skrótu zaznaczamy fragment tekstu. W następnej kolejności decydujemy, gdzie w okienku tekstowym będą umieszczane efekty haszowania. Do wyboru mamy umieszczanie ich na końcu tekstu (append mode) lub wprost w miejscu występowania wyróżnionego fragmentu (replace mode).

Graficzny interfejs użytkownika prezentuje się następująco:

anonymizer

W ramach modyfikacji kodu, do których zachęcam, można wzbogacić skrypt o funkcjonalność wyszukiwania w tekście dopasowań do wyrażeń regularnych, co zresztą zostało już przeze mnie opisane w jednym z poprzednich artykułów. Nie ma też żadnych przeszkód, by dopisać kod odpowiedzialny za załadowanie pliku z danymi wejściowymi z dysku oraz oprogramować funkcję zapisu rezultatów działania programu do pliku wynikowego albo do bazy danych.

By anonimizacja nie zaburzała zanadto struktury danych, można też do programu wprowadzić modyfikacje polegające na bardziej subtelnym formatowaniu hasza, a co najmniej jego ‚docinaniu’ lub rozszerzaniu do wielkości danych wejściowych, wyrażonej liczbą znaków.

Oto kod źródłowy:

require 'gtk2'
require 'digest'

def hashing(algorithm, text_to_hash)
   hashed_data = ""
   case algorithm
      when 'MD5'
         hashed_data = Digest::MD5.hexdigest(text_to_hash)
      when 'SHA-1'
         hashed_data = Digest::SHA1.hexdigest(text_to_hash)
      when 'SHA-2'
         hashed_data = Digest::SHA256.hexdigest(text_to_hash)
      when 'RMD'
         hashed_data = Digest::RMD160.hexdigest(text_to_hash)
      else
         STDERR.puts "Hashing function not supported"
         exit
   end
   return hashed_data
end

def insert_text(string, widget)
   start_iter, end_iter, selected  = widget.buffer.selection_bounds
   if !selected
      start_iter, end_iter = widget.buffer.bounds
   end
   # puts "Start: #{start_iter}, End: #{end_iter}"
   widget.buffer.delete(start_iter, end_iter)
   widget.buffer.insert(start_iter, string)
end

def retrieve_text(widget)
   start_iter, end_iter, selected  = widget.buffer.selection_bounds
   if !selected
      start_iter, end_iter = widget.buffer.bounds
   end
   text = widget.buffer.get_text(start_iter, end_iter)
   return text
end

window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
window.set_title  "Interactive Anonymizer - Janusz Nawrat (2014)"
window.border_width = 10
window.set_size_request(-1, -1)

window.signal_connect('destroy') { Gtk.main_quit }
window.signal_connect('delete_event') { Gtk.main_quit }

main_vbox = Gtk::VBox.new()

edit_vbox = Gtk::VBox.new(false, 0)
hash_hbox = Gtk::HBox.new(false, 0)
ctrl_hbox = Gtk::HBox.new(true, 0)

main_label = Gtk::Label.new("Anonimization by hashing of selected text")

textview = Gtk::TextView.new
textview.buffer.text = ""
edit_vbox.set_size_request(600, -1)

scrolledw = Gtk::ScrolledWindow.new
scrolledw.border_width = 5
scrolledw.add(textview)
scrolledw.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS)

scrolledw.set_size_request(-1, 200)

main_vbox.add(edit_vbox)

edit_vbox.pack_start(main_label)
edit_vbox.pack_start(scrolledw)

hash_frame = Gtk::Frame.new("Hashing function")

$hashing_function = 'MD5'

hash_radio1 = Gtk::RadioButton.new("_MD5")
hash_radio2 = Gtk::RadioButton.new(hash_radio1, "SHA-_1")
hash_radio3 = Gtk::RadioButton.new(hash_radio1, "SHA-_2 (SHA-256)")
hash_radio4 = Gtk::RadioButton.new(hash_radio1, "_RIPEMD-160")

hash_hbox.pack_start(hash_radio1, :expand => true, :fill => true, :padding => 0)
hash_hbox.pack_start(hash_radio2, :expand => true, :fill => true, :padding => 0)
hash_hbox.pack_start(hash_radio3, :expand => true, :fill => true, :padding => 0)
hash_hbox.pack_start(hash_radio4, :expand => true, :fill => true, :padding => 0)

hash_radio1.signal_connect("clicked") { $hashing_function = 'MD5' }
hash_radio2.signal_connect("clicked") { $hashing_function = 'SHA-1' }
hash_radio3.signal_connect("clicked") { $hashing_function = 'SHA-2' }
hash_radio4.signal_connect("clicked") { $hashing_function = 'RMD' }

hash_frame.add(hash_hbox)
main_vbox.add(hash_frame)

oper_mode_hbox = Gtk::HBox.new(false, 5)
oper_mode_hbox.border_width = 5

oper_frame = Gtk::Frame.new("Mode of operation")
check_append = Gtk::CheckButton.new("Append mode")
check_replace = Gtk::CheckButton.new("Replace mode")

$append_mode = 1
check_append.set_active true

$replace_mode = 0
check_replace.set_active false

check_append.signal_connect "clicked" do 
   if check_append.active?
      $append_mode = 1
      check_replace.set_active false
   else
      $append_mode = 0
   end   
end

check_replace.signal_connect "clicked" do 
   if check_replace.active?
      $replace_mode = 1
      check_append.set_active false
   else
      $replace_mode = 0
   end   
end

oper_frame.add(oper_mode_hbox)

oper_mode_hbox.pack_start(check_append, :expand => true, :fill => true, :padding => 0)
oper_mode_hbox.pack_start(check_replace, :expand => true, :fill => true, :padding => 0)

main_vbox.add(oper_frame)

execute_button = Gtk::Button.new("Execute")
clear_button = Gtk::Button.new("Clear")
exit_button = Gtk::Button.new("Exit")

execute_button.signal_connect "clicked" do 
   selected_text = retrieve_text(textview)
   if $append_mode == 1
      textview.buffer.text += "\n#{selected_text} (#{$hashing_function})-> #{hashing($hashing_function, selected_text)}"
   end
   if $replace_mode == 1
      string = hashing($hashing_function, selected_text)
      insert_text(string, textview)
   end
end

clear_button.signal_connect "clicked" do 
   textview.buffer.text = ""
end

exit_button.signal_connect "clicked" do 
   Gtk.main_quit 
end

ctrl_hbox.pack_start(execute_button, true, true, 1)
ctrl_hbox.pack_start(clear_button, true, true, 1)
ctrl_hbox.pack_start(exit_button, true, true, 1)

ctrl_hbox.border_width = 8

main_vbox.add(ctrl_hbox)

window.add(main_vbox)
window.set_window_position(:center)
window.show_all
Gtk.main

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: