2009年10月27日星期二

ASP.NET Server Side & Client Side資料加密處理

對於ASPX網頁上暫存資料方面,ServerSide最常用多數都是用Session,ClientSide應該都是ViewState吧,前者應該沒有太多保安問題,但後者的ViewState其實要Decode根本不難,所以加密功夫其實很重要的。近期工作上經常要使用 jQuery + Web Service處理資料,有些敏感資料會經JSON傳回Browser,又或者經Hidden Field傳回Server,有些情況是很難避免的 (特別是上司要求...),我看過有些懶人只用Base64轉碼就當是加密其實真的很危險。

.NET Framework其實本身在System.Security.Cryptography NameSpace下已經提供了大量加密方式,在MSDN看過後,取了幾種針對String加密的,做了少少資料搜集有關 3DES / DES / RSAAES (Rijndael) 的比較,其實4種方法同樣都需要一項Key才可以進行正常解密,所以即使知道你網頁中加密後的字串,而不知道你所設定的Key都不可能正常解密的。

論安全性,粗略評估後的排行應該是 AES (Rijndael) > AES > 3DES > RSA / DES。

至於使用方面,Client-Side可以使用以下的Javascript 解密AES:
http://www.movable-type.co.uk/scripts/aes.html

Server-Side方面,其實MSDN上已有很清晰的Sample,以下就是使用AES (Rijndael)方式對String進行encrypt和decrypt的例子。

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

class RijndaelSample
{

static void Main()
{
try
{
// Create a new Rijndael object to generate a key
// and initialization vector (IV).
Rijndael RijndaelAlg = Rijndael.Create();

// Create a string to encrypt.
string sData = "Here is some data to encrypt.";
string FileName = "CText.txt";

// Encrypt text to a file using the file name, key, and IV.
EncryptTextToFile(sData, FileName, RijndaelAlg.Key, RijndaelAlg.IV);

// Decrypt the text from a file using the file name, key, and IV.
string Final = DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV);

// Display the decrypted string to the console.
Console.WriteLine(Final);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}

Console.ReadLine();
}

public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
{
try
{
// Create or open the specified file.
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

// Create a new Rijndael object.
Rijndael RijndaelAlg = Rijndael.Create();

// Create a CryptoStream using the FileStream 
// and the passed key and initialization vector (IV).
CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateEncryptor(Key, IV), CryptoStreamMode.Write);

// Create a StreamWriter using the CryptoStream.
StreamWriter sWriter = new StreamWriter(cStream);

try
{
// Write the data to the stream 
// to encrypt it.
sWriter.WriteLine(Data);
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
// Close the streams and
// close the file.
sWriter.Close();
cStream.Close();
fStream.Close();
}
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
}

}

public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
{
try
{
// Create or open the specified file. 
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

// Create a new Rijndael object.
Rijndael RijndaelAlg = Rijndael.Create();

// Create a CryptoStream using the FileStream 
// and the passed key and initialization vector (IV).
CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateDecryptor(Key, IV), CryptoStreamMode.Read);

// Create a StreamReader using the CryptoStream.
StreamReader sReader = new StreamReader(cStream);

string val = null;

try
{
// Read the data from the stream 
// to decrypt it.
val = sReader.ReadLine();


}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
// Close the streams and
// close the file.
sReader.Close();
cStream.Close();
fStream.Close();
}

// Return the string. 
return val;
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
return null;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
return null;
}
}
}

2009年10月23日星期五

Google Chrome Portable

portableapps.com終於都出佢自家的Google Chrome Portable。
之前在其他地方都見過有人製作的Portable版,不過我就不太相信一些不知名人士製作的Portable軟件。

因為有部份只是從installer extract file出來,run得到,就當是Portable,但亦有機會寫入資料至Registry 或分散元件檔案至其他地方等等。



portableapps.com出品就肯定品質有保証了。
Google Chrome Portable
http://portableapps.com/apps/internet/google_chrome_portable

2009年10月21日星期三

Visual Studio 2010 Beta 2


Visual Studio 2010 Beta 2今日剛剛Release,照以往推出時間來看,應該下年年頭約1,2月就會出正式版。
除了Visual Studio 2010轉了新Logo外,MSDN的Logo都轉了。

而整個MSDN主色都轉為紫色,文章部份再分為Classic / Lightweight / ScriptFree 三個顯示模式,取代之前的 loband (low bandwidth) 模式。

MSDN上已經有大量有關.NET Framework 4.0和Visual Studio 2010的文章可以參考,順道整理一下:
.NET Framework 4.0

Visual Studio 2010

ASP.NET 4

C# 2010

Visual Basic 2010

2009年10月17日星期六

Unbox MVP Award Kit!

今天終於收到了Microsoft寄來的MVP Award Kit,拿上手有點重量,大概都有1KG,個盒都幾靚。
內含一個獎座 / 一張MVP Certificate / 一張MVP証 / 一個襟章和一份NDA。奇怪的是,Microsoft 把我的名字印錯了 ....但Fedex包裹上印的卻是正確。
自己每天工作對著的大多數都是Microsoft的東西,得到一個MVP,其實算是對自己一些安慰 ,始終有些東西,未必可以帶來財富,但卻有錢都買不到。

2009年10月13日星期二

Aptana PHP Plugin停止開發~轉用PHP Designer 7

今天看到一直用的Aptana慢慢轉向商業化經營了...原本Domain是aptana.com,現在瓜分為.com和aptana.org for community plugins。最可惜的是Aptana已聲明PHP Plug-in停止開發 (見 Aptana PHP Plugin discontinued? ) ,會把現有的module移至Eclipse PDT。但我真的用不慣Eclipse系的IDE,可能我個人太Visual Studio向,用起Eclipse甚至Netbeans都覺得怪怪地。

唯有再看看其他PHP IDE有冇更新,有沒有更新至我要求的HTML + JavaScript Code Completion / PHP Code Hints等等。
我對工作上/興趣上的軟件要求很高,而且Programming的IDE更是我謀生工具,豈能兒戲。
我堅信 "工欲善其事,必先利其器。"的道理,無論軟件介面設計,Right-Click的menu command"就不就手"都有要求。

試過很多,比較出名的PHPEdit , PhpED , Zend Studio , Komodo IDE都試過,依然不稱心,主要都是不如Visual Studio無論HTML,JS,CSS都主面支援。

再試試PHP Designer 7,原來前幾天剛出新版,看ChangeLog見到這幾項,立即試試 :
New. JavaScript code completion
New. Support for JavaScript Object-oriented programming (OOP)
New. JavaScript code tip with extended information/documentation
New. Support for user-defined JavaScript functions
New. Support for user-defined JavaScript variables
New. Code Explorer for JavaScript
New. Jump to JavaScript declarations
New. Support for the JavaScript framework jQuery

試用過後,算是不錯,感覺很完整,無論HTML,JS,CSS,PHP的 Code Completion都做得不錯,但依然有半秒到Delay(即使我已set 0ms delay)。
介面都較接近返Visual Studio,不錯不錯。

Screenshots of phpDesigner 7
http://www.mpsoftware.dk/phpdesigner_screenshots.php

2009年10月8日星期四

Ajax Control Toolkit (v3.0.30930) released

5月時才大更新了一次,那時加入了
  1. HTMLEditor
  2. ComboBox
  3. ColorPicker
估不到幾個月後又有新版。
新版v3.0.30930加入兩個極之重大的新Control :
  1. Seadragon - JavaScript版本的Deep Zoom
  2. AsyncFileUpload - 就是Asynchronous AJAX File Upload Control,這個才是重點,因為大部份Async FileUpload的Control都要收錢,現在有這個就好了。

OneFileCMS - 最簡單的CMS

這個叫OneFileCMS的東西,整個程式就是一個PHP File,我諗應該算是全世界最簡單的了。
http://onefilecms.com/

2009年10月7日星期三

Project Manager 唔識 Program

起香港做電腦行業,要上位做到Manager級,
大概可以分三類,1.高相關學歷 2.真材實料 3.靠吹水 。
第1.和第2. 是無可厚非的,至於第3.認唔認同就因人而異,個人就唔太認同。

在Google上輸入Keyword : Project Manager 唔識 Program ,已經可以找到相關討論:
香港討論區 - 各行各業 - 資訊科技界 I.T.
PM需唔需要識Programming? 我覺得絕對要識,但需唔需要超強?咁又未必。
當然如果Coding 都強的話當然就更加好喇,我諗任何人都唔想有事時,PM十問九唔知,話知但又唔肯定的,最後叫你自己Google吧。

Project Manager - 職責就是Project Management : Resource Control / Documentation / Source Control 等等之外,本身不應接觸Implement層面,但萬一真是要的話,就出事了。
以近期我接手做Project的Database design做例,我估是PM技癢情況下Design schema的,就說明現實中PM要不要懂Programming。



這個Table有幾點都有問題 :
1. ParentMenuCode和Code,實際data是INT,但DataType卻有理冇理Set Nvarchar....
2. ParentMenuCode是FK Reference Code,實質就是主Menu和副Menu的關係,但理應分開兩個Table,現在放在一起,就會出現recursive的情況,到需要第三層目錄時就麻煩,再者Code是not null, ParentMenuCode是allow null , 是不是很奇怪...
3. ImageURL和RedirectURL 長度不一,一個是100,另一個是200。雖然好像太吹毛求瑕,但實際寫program時,要set input的max lenght就查一查長度都幾煩。

還有一些不方便公開ScreenShot的,例如Table名有空格,Primary Key / Constraints / Default value,應有則冇等等問題。
出現這些問題,原因就是設計的人沒有由Programming角度出發。
例如Table有空格,沒錯,看起來更清楚,但每次條Query都要用 [ ] (MSSQL) 或 ` ` (MySQL) Quote起來。
明明是應該Default是空白的卻可以Null,令到每次新增一條Record時都可能要特地Insert一個空白入去,或者相反用IsDBNull之類的Function是檢查,首當其衝當然是我這個寫Code的人。

所以現在你問我PM要不要識寫Program,我會答你至少都要"懂"。

PHP Comments Remover & Space Cleaner

一個免費的PHP Comments Remover,去PHP和HTML格式的Comment,另有去空白和內建obfuscator。
我試用過還不錯,用Universal Extractor後便是Portable版。

如果想進一步除去Line Break可以用用這個 PHP Code Cleaner and Indenter

Download PHP Comments Remover

2009年10月2日星期五

當選Microsoft MVP

7月時參選Microsoft MVP,在差不多已經忘記的時候收到Microsoft的Email通知當選了ASP/ASP.NET的MVP。

填報名表的時候,主要都是靠這個Blog的各類Programming文章,部份jQuery的教學文章和各大國外討論區如,StackOverFlowMSDN Forum之類的回應文章得選。

看看下年有沒有機會連任了。

小心選擇Facebook Application

近日有點時間,開始寫Facebook Application,大概是一個Facebook API + Google Map API 的小程式。
寫的過程發現到經Facebook API的Users.getInfo Call 可以取得很多個人資料,開始查證一下Facebook的Guidelines,看看是否容許儲存Profiles的資料。

一看之下,原來Facebook已表明有什麼是Storable Data,其他資料一概不可以儲存超過24小時。

但我相信以Facebook Application的架構,其實是沒有可能知道程式背後對資料做過什麼,如果程式把資料Copy至另一個媒體,其實已經追查不到。

就算是單單一個"送禮物","占卜","每日一字"的小程式,只要你加入Application前,一按"Allow",程式已經可以無限制地存取你的資料。唯一可以防止的方法就是去Privacy Settings選擇你公開什麼資料,但Facebook的default setting差不多是全開的。所以很多人胡亂去增加Application其實是有風險的。