2012年4月4日 星期三

在C#中使用RSA加解密

RSA是非對稱式加密,金鑰分為公鑰和私鑰兩種,詳情可參考RSA加密演算法。一般來說,公鑰會存成.crt,並且撒出去讓大家知道,而私鑰則是存成.pfx,由自己保管,同時加上密碼來保護

在使用這兩把鑰匙的時候,需先用X509Certificate2物件將其讀出

using System.Security.Cryptography.X509Certificates;

RSACryptoServiceProvider LoadPublicKeyFromFile(
string publicKeyFile)
{
///load public key from .crt
X509Certificate2 pubKey =
new X509Certificate2(publicKeyFile);

return (RSACryptoServiceProvider)pubKey.PublicKey.Key;
}

RSACryptoServiceProvider LoadPrivateKeyFromFile(
string privateKeyFile, string password)
{
///load private key from .pfx with password
X509Certificate2 priKey =
new X509Certificate2(privateKeyFile, password);

return (RSACryptoServiceProvider)priKey.PrivateKey;
}

有時會需要將鑰匙存入資料庫,可以採用XML的格式,RSACryptoServiceProvider有提供很方便的存讀XML字串的函式。

string ToXmlString(RSACryptoServiceProvider key)
{
/// true for private key, false for public key
return key.ToXmlString(true);
}

RSACryptoServiceProvider FromXmlString(string xmlString)
{
RSACryptoServiceProvider key =
new RSACryptoServiceProvider();
key.FromXmlString(xmlString);

return key;
}

注意,不論是公鑰或私鑰皆可以取得一個RSACryptoServiceProvider的物件。實際上在使用RSA加解密演算法時,有時會需要用到私鑰加密,公鑰解密(數位簽章,由自己發給別人,證實該資訊是由我發出),有時則是公鑰加密,私鑰解密(確認只有自己才可以看的到的文件),所以這兩把鑰匙的用法是相同的。

byte[] Encrypt(byte[] rawData, RSACryptoServiceProvider key)
{
/// encrypt without OAEP, but PKCS#1 v1.5 padding
return key.Encrypt(rawData, false);
}

byte[] Decrypt(byte[] encData, RSACryptoServiceProvider key)
{
/// decrypt without OAEP, but PKCS#1 v1.5 padding
return key.Decrypt(rawData, false);
}

在這邊使用哪種padding演算法都可以,但是記得加解密的時候需要用同樣的演算法即可。另外,因為加解密時都是採用byte陣列做為原始資料,所以如果原本是string物件的話,可以透過Convert.FromBase64String及Encoding.UTF8.GetString互為轉換。

--
參考資料
RSACryptoServiceProvider Class
Optimal asymmetric encryption padding

2012年2月28日 星期二

報告服務(Sql Server Reporting Service, SSRS)的高可用性(High Availability, HA)

微軟的資料庫伺服器(Sql Server)提供了報告服務(Reporting Service),讓客戶可以很容易的產生有關資料庫狀態的報告,像是登入的列表或是某個事件發生的頻率等等。只要有相對應的記錄,都可以用查詢的方式,定期或是依照需求產生報告。有關報告服務的架構可以參考剖析SQL Server 2005中的報告服務架構

在提供這樣的服務的同時,系統的高可用性也必須涵蓋這部分。報告服務的高可用性可以分成三個方面來考慮,服務,報告服務資料庫,以及查詢資料庫。

服務的部分比較單純,為了提供高可用性,就多建立幾台報告服務伺服器即可。而查詢資料庫的部分則如同一般資料庫伺服器的高可用性,可以採用叢集(Cluster)或是鏡像(Mirroring)等方式。值得注意的是,由於報告服務的查詢字串有提供故障轉移(Failover Partner)的選項,所以如果採用鏡像的方式時,只需要將備份的伺服器網址填入該欄位,在故障發生時,報告服務就會自動查詢備份的資料庫伺服器,而不會造成服務的中斷。

最困難的部分在於報告服務資料庫的高可用性。由於在報告服務伺服器端僅能設定一台報告服務伺服器(至少在2008之前尚未提供,可以參考ReportServer (TempDB) Mirror capability),所以如果採用鏡像的方式,在主伺服器發生故障時,無法自動將設定更新到備份伺服器。

在這樣的狀況下,第一種選擇是直接將報告服務的資料庫切開,每組報告服務都有自己的資料庫,所以在某一台報告服務+資料庫的伺服器故障時,其他台仍然可以正常運作。但問題是這些資料庫之間沒有同步,所以必須對每個資料庫匯入相同的範本及資料源。同時,報告服務的歷史資料也會散落在各地。

第二種選擇是純粹的鏡像,將所有的報告服務設定相同的資料庫,如何設定可以參考How to: Configure a Report Server Scale-Out Deployment (Reporting Services Configuration)。此方法在主要資料庫伺服器故障時,需要手動將報告服務的伺服器設定到備份的伺服器。如果不希望手動,也可以透過代理服務(Agent Service),在故障發生時,用rsconfig設定報告服務的資料庫。此方法的細節可以參考Reporting Services Disaster Recovery

第三種是微軟官方的建議,就是使用叢集的方式,設定可以參考安裝 SQL Server 2008 容錯轉移叢集心得筆記。不過在叢集的資料庫伺服器上,無法同時安裝報告服務,也就是說,需要額外的數台伺服器來提供高可用性的報告服務。細節可以參考Planning a Deployment Topology

--
參考資料
SQL Server Reporting Services Disaster Recovery Case Study
How to: Configure SharePoint Integration on Multiple Servers

2012年1月31日 星期二

在虛擬機器(Vitual Machine)中擴充硬碟

使用虛擬機器最重要的好處之一,就是可以彈性的擴充硬體
硬體的擴充動作相較於實體機器來說,就少掉了更新硬體這一步驟
(當然要在開虛擬機器的實體機器的硬體限制下)
而Windows在更新CPU或記憶體都是自動完成的
所以在虛擬機器上擴充這兩者都僅僅需要關機,設定,開機三個步驟

如果是一般的硬碟擴充,只要先在虛擬機器的設定中延伸(Expand)硬碟

再到作業系統裡面使用內建的diskpart將同一個硬碟擴充即可

C:\Documents and Settings\Administrator>diskpart

Microsoft DiskPart version 5.2.3790.3959
Copyright (C) 1999-2001 Microsoft Corporation.
On computer: WIN2K3X86

DISKPART> list volume

Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 C NTFS Partition 15 GB Healthy System
Volume 1 D CD-ROM 0 B Healthy
Volume 2 E New Volume NTFS Partition 20 GB Healthy

DISKPART> select volume 2

Volume 2 is the selected volume.

DISKPART> extend

DiskPart successfully extended the volume.

DISKPART> list volume

Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 C NTFS Partition 15 GB Healthy System
Volume 1 D CD-ROM 0 B Healthy
* Volume 2 E New Volume NTFS Partition 21 GB Healthy

DISKPART>


另外,在Windows 2003中
因為保護作業系統的檔案,所以無法變更系統磁碟的大小
這時候就需要一點小技巧,在把系統碟延伸後
先將系統碟掛到另外一台機器當作一般磁碟並擴充
此時用原本的虛擬機器開機,就會發現系統磁碟大小已經更改成功了

--
參考資料
How to Extend Windows Boot Volumes in VMware
如何擴充 VMware 虛擬磁碟及作業系統容量