Tìm hiểu về chữ kí số và QRCode trong Ruby On Rails

Tìm hiểu về chữ kí số và QRCode trong Ruby On Rails

Chữ kí số là gì?

Chữ kí số là thông tin đi kèm dữ liệu nhằm giúp xác thực tính toàn vẹn của dữ liệu đó

QRCode là gì?

QR là từ viết tắt của Quick Response (“Mã phản hồi nhanh”) hay còn gọi là mã vạch ma trận (matrix-barcode) là dạng mã vạch hai chiều (2D) được phát triển vào năm 1994 bởi công ty Denso Wave, Nhật Bản. Mã QR (QR code) có thể được đọc bởi máy đọc mã vạch hay ĐTTM có chức năng chụp ảnh với phần mềm để quét mã vạch, trong đó sử dụng thuật toán sửa lỗi Reed-Solomon.

QR code gồm những module màu đen, được xắp xếp theo những quy luật nhất định trong một ô vuông có nền trắng. Sự tổ hợp những module này đã mã hóa cho rất nhiều loại dữ liệu, bao gồm: link dẫn đến trang web, hình ảnh, thông tin, chi tiết về sản phẩm, quảng cáo cho sản phẩm.

Các QR code nhỏ nhất là 21x21 pixel, và lớn nhất là 177x177, mỗi mẫu có kích thước khác nhau đó được gọi là một phiên bản.

Khả năng sửa lỗi

Chuẩn Sửa lỗi
L 7%
M 15%
Q 25%
H 30%

Khả năng lưu trữ dữ liệu

Loại dữ liệu Lưu trữ
Numberic 7,089 ký tự
Alphanumeric 4,296 ký tự
Nhị phân 2,953 bytes
Kanji/Kana 1,817 ký tự

Các loại định dạng dữ liệu QR code có khả năng mã hóa

  • Địa chỉ URL
  • Văn bản (Text)
  • Hình ảnh (Images)
  • Số điện thoại
  • Tin nhắn (SMS)
  • Thông tin liên hệ (Contact details)
  • Vị trí địa lý (Geo-location)
  • Mật khẩu truy cập Wifi
  • Địa chỉ email
  • Thông tin cá nhân trên mạng xã hội
  • Thông tin sự kiện (Events)
  • Địa chỉ download, …

Kết hợp chữ kí số và QRCode để xác thực tính toàn vẹn của dữ liệu

Quá trình tạo ra QRCode ứng dụng chứ kí số

Bước 1: Rút trích thông tin đặc trưng của Văn bản;

Bước 2: Tạo QR code từ: các thông tin đặc trưng, kết hợp với chữ ký số của đơn vị phát hành Văn bản;

Bước 3: In QR code lên Văn bản;

Bước 4: Người dùng sử dụng thiết bị đọc mã vạch hoặc ĐTTM có phần mềm được thiết kế riêng trong việc xác thực QR code này.

Có thể hình dung rõ hơn thông qua sơ đồ sau

Quá trình xác thực QRCode

Bước 1: Sử dụng đầu đọc mã vạch hay ĐTTM để quét QR code trên tài liệu cần xác minh. Trích ra DS và SI của Văn bản;

Bước 2: Giải mã DS bằng cách sử dụng hàm giải mã DPK của thuật toán RSA, kết hợp với khóa công khai (QK) của đơn vị phát hành văn bản (được lưu trữ tại Root-CA). Ta có DecValue: DQK(DS,QK);

Bước 3: Dùng hàm H() để băm thông tin SI, ta có EncValue: H(SI);

Bước 4: Đối chiếu cặp giá trị DecValue và EncValue; nếu khớp nhau thì QR code này là hợp pháp (nghĩa là văn bản này có giá trị pháp lý và được cấp bởi một cơ quan có thẩm quyền).

Có thể hình dung rõ hơn thông qua sơ đồ sau

Demo ứng dụng đơn giản với Ruby On Rails

Đầu tiên để thuận tiện cho việc demo, ở đây mình dùng gem 'rqrcode' để phục vụ cho việc tạo chữ kí số

Trong file Gemfile thêm dòng gem 'rqrcode' sau đó lưu lại và chạy lệnh bundle install để cài đặt

Tạo 1 controller để thực hiện demo, ở đây mình tạo controller tên là ren_qrcodes_controller.rb.

Trong method index của RenQrcodesController tiến hành tạo ra cặp khóa bí mật và khóa công khai như sau

private_key = OpenSSL::PKey::RSA.new(512)

@public_key = private_key.public_key

Sử dụng private_key để mã hóa dữ liệu và tạo chữ kí số, sử dụng public_key để giải mã

Tiến hành tạo chữ kí số cho dữ liệu với private_key (ở đây mình sử dụng luôn họ và tên)

digital_signature = ren_digital_signature(private_key, "truongvanphong")

def ren_digital_signature(private_key, information)

private_key.sign(OpenSSL::Digest::SHA256.new, information)

end

Sau khi thu được chữ kí số, sử dụng gem 'rqrcode' để tạo ra mã QRCode tương ứng

@qrcode = RQRCode::QRCode.new(digital_signature)

Ta thu được object có dạng như sau

Lúc này file ren_qrcodes_controller.rb hoàn chỉnh là

Tiến hành đổ dữ liệu ra view trong file app/views/ren_qrcodes/index.html.erb như sau

Định dạng thêm css cho view để show ra qrcode:

Xong ~ Bây giờ vào trang http://localhost:3000/ren_qrcodes để xem kết quả ta được

Sử dụng smartphone để scan thử ta được

Có thể thấy rằng hầu hết các kí tự đều không hỗ trợ =)) , bởi vì trên thực tế sẽ có những phần mềm riêng biệt để nhận biết các mã QRCode có độ phức tạp cao như trên. Để cho tường minh hơn thì có thể thay bằng:

@qrcode = RQRCode::QRCode.new("digital_signature")

sau đó scan thử thì thu được text là "digital_signature" tương ứng.

Tuy nhiên về cơ bản thì vẫn theo một quy trình là: Văn bản -> chữ kí số -> QRCode -> chữ kí số

Vậy làm thế nào để xác thực được tính toàn vẹn của dữ liệu thông qua chữ kí số ?

Điều này đã được mô tả ở trên (Quá trình xác thực QRCode), gem 'rqrcode' cung cấp cho chúng ta một method verify sử dụng public_key để xác thực có thể được mô tả trong hàm sau: def check_valid_input(signature, information)

@public_key.verify(OpenSSL::Digest::SHA256.new, signature, information)

end

method này trả về true nếu dữ liệu toàn vẹn, trả về false nếu không toàn vẹn


Bài viết này chỉ dừng lại ở mức độ tìm hiểu vì vậy kiến thức còn nhiều thiếu sót, rất mong nhận được sự góp ý của mọi người


Tài liệu tham khảo

https://github.com/whomwah/rqrcode

https://www.researchgate.net/publication/277311597_Advanced_Security_Algorithm_Using_QRCode_Implemented_for_an_Android_Smartphone_System_A_QR

https://www.researchgate.net/publication/327837238_Application_of_QR_Code_and_digital_signatures_in_the_process_of_forgery_prevention_for_paper-based_diplomas_and_certificates