5. Bố cục Luận văn
3.3.4. Công cụ ký số trên web
Mục tiêu thiết kế công cụ ký số trên web nhằm thực hiện việc ký số trực tiếp trên ứng dụng web, tuy nhiên vẫn đảm bảo tính toàn vẹn và tin cậy cho tài liệu được ký (vì tài liệu được ký tại máy trạm và thao tác trực tiếp trên thiết bị eToken). Chương trình ký được phát triển trên siverlight phiên bản 5 và.Net FrameWork 4.0.
Việc thiết kế công cụ ký số đảm bảo các yêu cầu sau:
- Cho phép người dùng lựa chọn văn bản để ký (văn bản định dạng.pdf) - Khi thực hiện lệnh ký số cho văn bản ứng dụng tự động giao tiếp với thiết bị eToken và thư viện mật mã đã cài đặt tại máy trạm để thực hiện ký văn bản.
- Kết quả trả về tệp văn bản được ký và tự động đẩy lên máy chủ - Thông báo cho người dùng kết quả đã thực hiện.
Mô tả chƣơng trình:
Đầu vào: - Tệp văn bản cần ký - Thiết bị eToken
- Thao tác, lệnh từ người dùng Đầu ra: - Tệp văn bản được ký
- Đẩy tệp văn bản ký lên máy chủ
- Thông báo cho người dùng kết quả thực hiện Các bước:
B1 Kiểm tra độ tin cậy (ứng dụng phải được tin cậy với trình duyệt bằng cách sử dụng chứng chỉ để ký cho ứng dụng và cài đặt tại máy trạm. Nếu không tin cậy thì cho thông báo và kết thúc.
B2 Cho phép người dùng duyệt tệp văn bản, nếu tệp văn bản
không dúng định dạng thì yêu cầu duyệt lại tệp văn bản. B3 - Kiểm tra thiết bị eToken, nếu hợp lệ (đã kết nối và nhập
đúng mã PIN) thì thực hiện ký tệp văn bản - Đẩy tệp văn bản đã ký lên máy chủ - Thông báo ký thành công
Mã chương trình: using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Runtime.InteropServices.Automation; using System.IO; using System.Windows.Browser; using Demo.Service_UpLoad; using System.ServiceModel; namespace Demo {
public partial class MainPage : UserControl { string FileName = ""; string UploadWS_url = ""; public MainPage() { InitializeComponent(); }
public MainPage(IDictionary<string, string> initParams) {
InitializeComponent(); try
{
this.UploadWS_url = initParams["UploadWS"];
}
catch (Exception) { } }
private void Button_Click(object sender, RoutedEventArgs e) { if (Application.Current.HasElevatedPermissions) { BrowserFile(); RefresbtnSign(); } else {
MessageBox.Show("Ứng dụng không được tin cậy với trình duyệt");
} }
private void BrowserFile() {
try
{
OpenFileDialog fld = new OpenFileDialog(); fld.ShowDialog();
FileName = fld.File.FullName;
lblFileName.Content = FileName.Substring(FileName.LastIndexOf(@"\") + 1); } catch (Exception) { FileName = ""; } }
private void button1_Click(object sender, System.Windows.RoutedEventArgs e) {
try
{
dynamic bcycom = AutomationFactory.CreateObject("BCYCryptoClass"); //bcycom.SignPDFByEtoken1(txtInputFile.Text,txtFileDes.Text);
MessageBox.Show("Đã ký xong văn bản"); }
catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void cmdTestWS_Click(object sender, System.Windows.RoutedEventArgs e) {
this.busyIndicator1.IsBusy = true; cmdTestWS.IsEnabled = false;
WSUploadSoapClient proxy = new WSUploadSoapClient(); if (!string.IsNullOrEmpty(this.UploadWS_url)) {
EndpointAddress MyEndpointAddress = new EndpointAddress(this.UploadWS_url); proxy.Endpoint.Address=MyEndpointAddress;
}
string fname = "", folderpath = ""; if (FileName == "")
{
MessageBox.Show("Bạn hãy chọn văn bản để ký "); this.busyIndicator1.IsBusy = false;
return; }
dynamic bcycom = AutomationFactory.CreateObject("BCYCryptoClass"); byte[] raw = null;
try
{
raw = (byte[])bcycom.SignPDFByEtoken2(FileName); }
catch (Exception) {
MessageBox.Show("Lỗi thao tác ký, hãy thực hiện lại thao tác"); busyIndicator1.IsBusy = false;
RefresbtnSign(); return;
}
getFileName(FileName, ref fname, ref folderpath); proxy.UploadCompleted+=new
EventHandler<UploadCompletedEventArgs>(proxy_UploadCompleted); proxy.UploadAsync(fname, raw);
}
void proxy_UploadCompleted(object sender, UploadCompletedEventArgs e) {
string sFileSign = Part.Substring(Part.LastIndexOf(@"\") + 1);
HtmlPage.Document.GetElementById("txtData").SetProperty("value", Part);//txtData
//HtmlPage.Document.GetElementById("txtFileName").SetProperty("value", sFileSign);//txtFileName
lblFileNameSign.Content = "Văn bản ký số: " + sFileSign; busyIndicator1.IsBusy = false;
//cmdTestWS.IsEnabled = true;
}
public static void getFileName(string filepath, ref string fname, ref string
folderpath) { if (filepath == null) return; if (filepath == "") return;
int pos = filepath.LastIndexOf('\\'); if (pos < 0)
return; else
{
fname = filepath.Substring(pos + 1); folderpath = filepath.Substring(0, pos); }
}
private void RefresbtnSign() { if (FileName == "") { cmdTestWS.IsEnabled = false; } cmdTestWS.IsEnabled = true; lblFileNameSign.Content = ""; } } }