Zastosowanie kodów QR do badania integralności dokumentów

Dziś chciałbym kontynuować rozważania na temat wykorzystania kodów QR w bezpieczeństwie zarządzania dokumentami i przedstawić dwa kolejne pomysły ich praktycznego zastosowania, zilustrowane prototypowymi skryptami.

Kody QR – o czym już wcześniej pisałem – mogą być wykorzystane do wizualizacji oznakowania dokumentów klauzulami klasyfikacji informacji. Na tym jednak nie kończy się paleta potencjalnych możliwości ich zastosowań. Z łatwością można je bowiem wykorzystać na przykład także do wizualizacji kryptograficznych sum kontrolnych dokumentów, by tym sposobem zapewnić im mechanizmy weryfikacji integralności. Idąc dalej, nie ma także powodów, dla których nie dałoby się znakować dokumentów podpisem elektronicznym, konwertowanym następnie do postaci kodu QR w celu wizualizacji. Warto podkreślić, że podpis elektroniczny zapewniłby coś więcej niż tylko kontrolę integralności dokumentów. Pozwoliłby także sprawdzać ich autentyczność.

Oba zaprezentowane w niniejszym artykule skrypty, nie pretendują do miana gotowych rozwiązań do natychmiastowego, praktycznego zastosowania. Są jedynie ilustracją tego, w jaki sposób można do takowego rozwiązania prostą drogą dojść. Jest też rzeczą oczywistą, że wspomniane, takie czy inne, docelowe rozwiązanie nie musi powstać na bazie skryptowych języków programowania. Może być zakodowane alternatywnie w jakimkolwiek języku kompilowanym.

Ja używam języków skryptowych, bo one najlepiej nadają się do szybkiego prototypowania pomysłów.  Robię to też po prostu, bo tak lubię. Ponadto, kodowanie w językach skryptowych ma jedną poważną zaletę – mianowicie jest szybkie, a ja nie mam czasu i cierpliwości na czasochłonny i długotrwały development🙂. Czas ten wolę poświęcać na generowanie kolejnych pomysłów.

Oba zaprezentowane poniżej skrypty posiadają także walory edukacyjne, bo też między innymi w tym celu zostały opracowane. Powstały bowiem na potrzeby autorskich warsztatów programowania narzędzi skryptowych wspomagających zarządzanie bezpieczeństwem informacji i systemów.

Pierwszy skrypt pokazuje, w jaki sposób można generować wizualizację sum kontrolnych plików, w formie kodów QR i jak w pełni automatycznie tworzyć raporty integralności w postaci dokumentów PDF. Przy tej okazji, osoby zainteresowane nieinterakcyjnym, automatycznym tworzeniem dokumentów PDF chciałbym zainteresować potężnymi możliwościami biblioteki Prawn autorstwa teamu w składzie: Gregory Brown, James Healy, Brad Ediger, Daniel Nelson, Jonathan Greenberg (dzięki chłopaki, fantastyczne robota!), którą pozwoliłem sobie wykorzystać na potrzeby skryptu, a która służy właśnie do przetwarzania dokumentów PDF z poziomu skryptów w języku Ruby. Zdaję sobie sprawę, że taka funkcjonalność może sama w sobie być impulsem do bliższego zapoznania się ze wspomnianą biblioteką.

# Author: Janusz Nawrat (2013)
require 'digest/md5'
require 'rqrcode_png'
require 'prawn'
# Don't forget to install the proper gems: gem install <module>
# before you try to execute of this script

# Syntax checking: script should be executed with a list of files
# for which the intergrity report will be generated.
# Globbing is of course allowed. For instance ruby this_script_filename *.rb 
if ARGV.length < 1
         puts "Proper syntax: ruby #{$0} file1 file2 ..."
         exit
end

# Simple function to generate MD5 checksum of the file
def hash_gener (file)
         begin
                   hash = Digest::MD5.hexdigest(File.read(file))
         rescue => e
                   puts "Problem, problem.... See the details:"
                   p e.message
                   p e.backtrace
         end
         return hash
end

# Easy way to generate QR code on the arbitrary data basis,
# saved subsequently to PNG graphic file
def qr_code_generate (text, output_file)
         begin
                   qr = RQRCode::QRCode.new( text, :size =>8, :level => :h )
                   png = qr.to_img                                           
                   png.resize(100, 100).save(output_file)
         rescue => e
                   puts "Problem, problem.... See the details:"
                   p e.message
                   p e.backtrace
         end
end

$hashes = Hash.new
$output_file = ""

ARGV.each do |file|
         begin
                   $hashes[file] = hash_gener(file)
         rescue => e
                   puts "Problem, problem.... See the details:"
                   p e.message
                   p e.backtrace
         end
end

# There is a very easy way to automatically generate PDF file.
# The Prawn library is that one I can recommend you
Prawn::Document.generate("report.pdf") do |pdf|
         pdf.text "File integrity report with QR codes", :align => :center, :size => 18
         pdf.text "Time and date: #{time = Time.new; time.inspect}", :align => :center, :size => 14
         pdf.move_down 12
         $hashes.each do |key,value|
                   printf("%30.30s - %s\n", key, value)
                   tekst = "#{key}: #{value}"
                   $output_file = "#{key}.png"
                   qr_code_generate(tekst,$output_file)
                   pdf.text "File: #{key}; Checksum (MD5): #{value}"
                   pdf.image $output_file
                   File.delete($output_file)
                   pdf.move_down 20

         end
         print "\n\nData was saved to report.pdf file"
end

Wywołanie skryptu skutkuje wygenerowaniem pliku PDF (report.pdf) oraz następującymi komunikatami na konsoli:

E:\Documents\scripts>ruby pdf_qrcode_checksum_reporter.rb *.rb

             qrcode_to_dbms.rb - a6b940ef212f4dd2814b17c24ed7f015
                regexp_tool.rb - c27b09cf8756128406589217660e123a
     simple_encrypt_with_tk.rb - 2f1fd14eb1cd99f85d4c59632273de9a
                subnet_calc.rb - a2605fdf6b1cc77c0723ce2efe432437
      blowfish_file_encrypt.rb - 84823a50db5ebfc46764dccf161bd689
        encryptor-decryptor.rb - 0a4fc24cff5f792574d32505d5ebf4ca
        gtk_encrypt_decrypt.rb - 60892c7df446ea94d2b59005c3b391a5
      office-doc_qr_tagging.rb - e654037378c27c5c7d9893fffd22df27
pdf_qrcode_checksum_reporter.r - ea9ebc023705a14000be7db4504ffcac
               pdf_workshop.rb - f879b18e8ac42149433c4945c1190a36
               qrcode_batch.rb - 536385388b363bbee0433457671cb7a4
           qrcode_character.rb - f90db5a2dd5a28778a5b901dbc785ef4
           qrcode_generator.rb - 6827e667b0f1656f3516f373225e5bdc

Data was saved to report.pdf file

Plik PDF (report.pdf) przedstawia się następująco:

Files integrity report

The files integrity report with QR codes as a checksum visualization.

Drugi skrypt pokazuje jak obliczyć sumę kontrolną dokumentu opracowanego przy pomocy procesora teksty MS Word i automatycznie wbudować jej wizualizację w formie kodu QR do tego właśnie dokumentu. Przy okazji omawiania wspomnianego skryptu, pragnę zwrócić Waszą uwagę na bibliotekę Win32OLE, która może bardzo się przydać w wielu innych, szerszych zastosowaniach do sterowania z poziomu skryptów Ruby wywołaniami i działaniem aplikacji oraz procesów uruchamianych w środowisku Windows (na przykład do automatyzacji przetwarzania dokumentów).

# Author: Janusz Nawrat (2013)
require 'win32ole'
require 'digest/md5'
require 'rqrcode_png'

# Syntax checking
# You have to cal this script along with the full path of the particular
# MS Word document on the command line
if ARGV.length < 1
         puts "Proper syntax: ruby #{$0} filename_of_document"
         exit
end

# Function to checksum generation for particular file
# You can replace MD5 with any other supported hashing algorithm
# for instance SHA
def hash_gener (file)
         begin
                   hash = Digest::MD5.hexdigest(File.read(file))
         rescue => e
                   puts "Problem, problem.... See the details:"
                   p e.message
                   p e.backtrace
         end
         return hash
end

# Function for QR Code generation in the form of PNG graphic
# You can change both the size of the code itself and the output
# PNG picture resolution to best fit you needs  
def qr_code_generate (text, output_file)
         begin
                   qr = RQRCode::QRCode.new( text, :size =>10, :level => :h )
                   png = qr.to_img                                           
                   png.resize(160, 160).save(output_file)
         rescue => e
                   puts "Problem, problem.... See the details:"
                   p e.message
                   p e.backtrace
         end
end

# Checksum generation for the document (you have to
# provide with the full path to this doc) specified
# on the command line.
# Generation of QR Code on the MD5 checksum basis
# and insertion it at the beginning of the document.
# Then saving this doc and closing the word processor.
begin
         word = WIN32OLE.new('Word.Application')
         document = word.Documents.Open(ARGV[0])
         word.visible = true # You can turn off the visibility of the word processor
         hash_of_file = hash_gener(ARGV[0])
         qrcode_checksum_file = "#{ARGV[0]}.png"
         data_to_qr = "File: #{ARGV[0]}; MD5 Checksum: #{hash_of_file}"
         qr_code_generate(data_to_qr, qrcode_checksum_file)
         document.range(0,0).Text = "\n"
         pic = document.InlineShapes.AddPicture('FileName' => qrcode_checksum_file)
rescue => e
         puts "Problem, problem.... See the details:"
         p e.message
         p e.backtrace
ensure
         word.documents.save()
         word.documents.close()
         word.Quit()
end

Skrypt należy wywołać z parametrem w postaci pełnej ścieżki dostępu do dokumentu MS Word, do którego chcemy wbudować (na jego sam początek) QR kodową wizualizację sumy kontrolnej MD5.

Insert QR code into MS Word doc

QR Code as a checksum visualization in the MS Word doc.

Skrypt oblicza sumę kontrolną, sam wywołuje procesor tekstu i wstawia grafikę z kodem QR do dokumentu, po czym automatycznie zapisuje dokument i zamyka procesor tekstu.

Na koniec wspomnę, że korzystanie z bibliotek wykorzystywanych w obu skryptach wymaga – rzecz jasna – instalacji odpowiednich gemów dla środowiska języka Ruby (gem install nazwa_modułu).

Zachęcam do rozwijania zaprezentowanych pomysłów – w tym celu zresztą je tutaj opisałem. Miłej zabawy!

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: