2014/06/14

MOOC

最近開始接觸 MOOC(Massive Open Online Course,大規模網路免費公開課程),網路上有很多介紹的文章,我不敢說對每個人都會有顯著的效益,但這就跟在求學的時候一樣,每個人都上了很多課,但不見得獲得了相同的知識,所以還是蠻建議有興趣的人可以研究看看。
我目前只接觸了 Codecademy 和 Coursera,Codecademy 是屬於程式設計的課程,因為是本業,所以想借此看看現在的趨勢;Coursera 的領域則非常廣泛,感覺就很像大學的通識課。由於我只各參與了一門課(還沒修完),所以沒辦法進行評價,但可以分享一下初步接觸 Coursera 的感想。

1. 大多數都是英文課程,透過影片進行授課,影片可以開啟字幕、可以調整速度、可以隨時暫停,所以對於想提升英文能力的人,我相信一定有幫助。
2. 如果是想快速了解課程的內容,影片幾乎都有簡體中文、甚至正體中文的字幕,相信可以提升學習的效率。
3. 很多已經結束的課程都開放隨時選修,只是就不清楚是不是還有做業、考試的互動了。
4. 課程會區分成許多段最多數十分鐘的影片,每週時數加總起來大概也不會超過兩小時,所以如果加上練英聽、做作業,粗估每週花費 12 ~ 24 小時應該就可以完成該週的進度。
5. Android 和 iOS 上都有 Coursera 的 App,影片都可以下載到手機或平板上,可以利用零碎的時間反覆觀看。

附上一些介紹 MOOC 的連結,提供給大家做參考:
http://www.thenewslens.com/post/45399/
http://www.thenewslens.com/post/36571/
http://www.inside.com.tw/2014/06/13/a-taiwanese-developer-thought-about-coursera

2014/06/11

Just a Note:StandardPasswordEncoder 解析

StandardPasswordEncoder 是 Spring Security 提供的 class,僅有兩個 method:encode 和 matches,分別用來對密碼進行編碼及驗證。

StandardPasswordEncoder(CharSequence secret)
String encode(CharSequence rawPassword)
boolean matches(CharSequence rawPassword,String encodedPassword)

編碼的演算法基本上為 Hash,但並非單純的 Hash,其因子有三:
1. Secret:透過 Constructor 傳入,用來和 Raw Password 一起進行 Hash 的資料,通常為有意義的唯一值,例如帳號,以避免不同帳號、相同密碼產生出一模一樣的 Hash 值。
2. Raw Password:密碼明碼。
3. Salt:為一亂數,用來強化密碼編碼。

編碼的基本流程:
0. 使用者註冊時,輸入帳號、密碼。
1. 根據帳號 (Secret) new 出一個 StandardPasswordEncoder 物件。
2. 呼叫 encode,傳入密碼 (Raw Password)。
 (1) 產生 n byte 的 Salt。StandardPasswordEncoder 中會產生 8 bytes 的亂數。同一系統中,Salt 的長度需相同,除非連長度都當作產生 Hash 的因子保存下來。
 (2) 將 (1) 產生的 Salt、1. 傳入的 Secret、2. 傳入的 Raw Password 組合起來一起進行 Hash 運算,產生 Hash。StandardPasswordEncoder 採用 SHA-256 演算法,並針對資料進行 1024 次 Hash 運算。
 (3) 取得 Salt+ Hash (Encoded Password),存入資料庫。

步驟 2. (1) 加入了未知長度、且每次隨機產生的 Salt,即使使用相同帳號 (Secret)、相同密碼 (Raw Password),每次編碼出來的結果也不會相同;
步驟 2. (2) 進行了多次 Hash 演算,最後的結果就不會是以單純的 ASCII 字元產生出的 Hash,而是值域更廣 binary data,可以增加暴力破解的難度。

驗證的基本流程:
0. 使用者登入時,輸入帳號、密碼。
1. 根據帳號 (Secret) new 出一個 StandardPasswordEncoder 物件。
2. 呼叫 matches,傳入密碼 (Raw Password) 和從資料庫取得的 Encoded Password。
 (1) 從 Encoded Password 中取出 Salt 和 Hash。
 (2) 將 (1) 取得的 Salt、1. 傳入的 Secret、2. 傳入的 Raw Password 組合起來一起進行 Hash 運算,產生 Hash'。
 (3) 比對 (2) 產生的 Hash' 和 (1) 取得的 Hash 是否相等。相等則代表密碼驗證成功。


原則上透過 StandardPasswordEncoder 的 encode 出來的結果已經很難透過暴力破解取得使用者密碼了,不過也可以再進一步調整部分編碼的參數,例如:
1. Salt 的長度。
2. Hash 時 Salt、Secret、Raw Password 排列組合。
3. Hash 的演算法和次數。
4. Salt、Hash 的排列組合。
只要在 encode 和 matches 中使用相同的因子,便可以自訂出獨有的密碼編碼機制來強化密碼的保護。

如此一來,即便有內部人員可以直接存取資料庫,也無法取得使用者的密碼。

2014/06/05

詐騙簡訊...

友人分享了一個詐騙簡訊,簡訊說「這是上次聚會的照片」,還附上了一個短網址。

短網址還原後,是個韓國的 IP,話說上次也是韓國的 IP,不知道是不是這個空間比較好租......

網址是個 php,但是居然可以瀏覽目錄(也太不專業了)。
目錄底下有兩個 php、一個 txt、一個 jpg、一個 apk( 一.一+ )。

php 沒辦法下載,會自動 rediret 去下載 apk 檔;
jpg 其實是個 xuite 的網頁,是個聚會的照片,跟簡訊描述一致,所以其實不算詐騙?(是這樣解釋的嗎?)
txt 是 log 檔,記錄了所有點擊簡訊內連結的裝置資訊,例如手機型號、OS版本、瀏覽器版本、IP、點擊的時間等等。附帶一提,這個 log 檔有 203 MB,包含 5/21 到今天的點擊資訊,總共有 63 萬筆......也就是每天有 4 萬多次點擊,其中有非常多人是一而再、再而三地點、不停地點......

apk 是重頭戲啦!馬上拿去反組譯,看看到底寫了甚麼神奇的功能,可以達到詐騙的目的。
基本上是一個在 Android 上可以跟遠端溝通的常駐程式,主要功能如下:
1. 取得此裝置通訊錄。
2. 遠端可偵測此裝置是否上線。
3. 取得此裝置所有收到的簡訊。(重點!)
4. 上傳所有目前裝置內的簡訊。
5. 透過此裝置發簡訊。

所以當使用者點擊了詐騙簡訊的連結、也安裝了 apk 後,這時候小額付款機制就派上用場了......
詐騙集團使用安裝木馬的手機號碼進行小額付費,小額付費會發認證簡訊到該手機上,因為上述 3 的功能,詐騙集團可以立刻拿到授權碼(根本不需要用 line 跟你裝熟、請你幫忙收簡訊......),其實現實中還有很多使用簡訊 OTP 進行認證授權的機制,這時候都變成詐騙集團可以利用的管道。
然後你的荷包就被掏空了......

報告完畢,謝謝收看。