2012年3月2日

[Android] 替 TextView 加上圖示

Android 的 TextView 除了顯示文字,還可以在上、下、左、右加上圖示。
透過程式,有三種方法:

TextView#setCompoundDrawablesWithIntrinsicBounds(int, int, int, int);
TextView#setCompoundDrawablesWithIntrinsicBounds(Drawable, Drawable, Drawable, Drawable);
TextView#setCompoundDrawables(Drawable, Drawable, Drawable, Drawable);

前兩個方法會完整顯示指定的 drawable;若使用最後一個方法記得要先呼叫 Drawable#setBounds() 指定 drawable 的顯示範圍。像這樣:

aDrawable.setBounds(0, 0, 60, 60);
textView.setCompoundDrawables(aDrawable, null, null, null);

2012年2月21日

[Android] 圓角框的陷阱

陷阱 1. 只有特定角落要圓角效果

作法:
指定預設值(「android:radius」)為大於 1 的值,再把不需要圓角的角落指定為「0dp」;
而且預設值不可以跟特定角落的圓角半徑值相同。

2012年1月9日

密碼應該怎麼存?

最近明文密碼的話題很紅,
決定來重貼以前關於密碼編碼(password hashing)的筆記:

  • 編碼(hash)時請記得加鹽(salt)
  • 不要整個系統都用一樣的 salt,請每次都以亂數方式產生。
  • 把 salt 跟 hash 放一起,不要分開存。
  • 結合方式最好可以有變化,
    例如:由明碼長度決定 salt 的插入位置。

用 PHP 寫起來大概像這樣:

$salt = substr(hash_func(uniqid(rand(), true)), 0, $saltLen);

$hash = hash_func($salt . $plain);

$saltStart = strlen($plain);
return substr($hash,0,$saltStart) . $salt . substr($hash,$saltStart+1);

另外,理想狀況是客戶端跟伺服器端間以加密方式(如,SSL)傳遞密碼。但是事情往往沒有這麼美好,沒辦法用 SSL 的話,可以參考〔延伸閱讀〕第 3 篇提到的「瀏覽器端 hash」。

@yllan 補充

密碼不要用 md5 比較好,要找比較難算的 hash function 例如 bcrypt 可以參數調整難易度。否則就算加了鹽,md5 還是很容易 crack

@yunglinho 補充: 《How To Safely Store A Password

  • Salts Will Not Help You
  • Use bcrypt

延伸閱讀:

  1. 密碼為什麼不能存「明文」? | 我的密碼沒加密
  2. A Basic Lesson in Password Hashing - seanmonstar
  3. hoamon's sandbox: 不應該在資料庫中紀錄使用者的明碼密碼