給初學者的 Android 加密工具
越來越多的黑客盯上了移動應用, 每天都會增加,因為移動應用中有黑客感興趣的東西,如 用戶數據 。 硬編碼( Hard-coded,注,固定寫死,不能修改的)安全秘鑰,SD 卡中以明文存放的個人信息,數據庫中未加密存儲的用戶名和密碼,收集的分析(analytics)并以明文方式發到遠程服務器,這些情況都使得攻擊更容易(得手)。
正確使用Cryptography工具,能保護我們的敏感數據,確保隱私和數據完整。另一方面,加密難用且容易誤用( cryptography is hard to use and easy to misuse )。 注意容易被破解的加密方式( broken cryptography) (如,使用不安全算法,或硬編碼秘鑰到二進制包),請查閱列表 2014年,移動領域10大風險 。因此,從中得到什么教訓?不用加密不可取,不能正確加密同樣不可取 (不提耗費的時間)。
為了能在安卓平臺上開發出安全的應用,接下來我們將介紹如何能既簡單又安全地進行加密。
首先,概括性地介紹一些常見的可集成到安卓應用中的 加密庫 。加密庫是包含諸如加密算法、填充方式和散列函數等工具的加密工具集合。
Bouncy Castle
充氣城堡軍團( Legion of the Bouncy Castle )是一個來自澳大利亞的公益團體,他們編寫了 Bouncy Castle 這個廣泛使用的類庫。該庫既提供了一個輕量級的密碼學 API,也是一個 Java 密碼擴展(JCE)的提供者。安卓平臺已經內置了一個精簡過的老版本 Bouncy Castle(同時為了適配安卓平臺也做了一些細小的改動)。結果就是任何在應用程序中構建和使用最新版本 BouncyCastle 類庫的嘗試都將導致類加載沖突。
Spongy Castle
Spongy Castle 背后的動機是允許安卓開發者在應用程序中使用任意版本的 BouncyCastle 類庫。SpongyCastle 就是對最新版本的 BouncyCastle 進行了簡單地重新打包;所有的 org.bouncycastle.* 包重命名為了 org.spongycastle.*,所有 Java安全 API 提供者的名字由 BC 改為了 SC。
OpenSSL
OpenSSL 是一個實現了 SSL 和 TLS 協議以及通用密碼庫的開源工具包。OpenSSL 已經被移植到了很多平臺,包括安卓。做為一個替代方案,你也可以從源碼構建(使用安卓 NDK),然后綁定到應用程序中。
現在我們假設出于應用程序的目的,你想要加密一些數據。你會使用哪個加密算法,AES 還是 DES?你的秘鑰多長,128 還是 256 比特?你會使用哪種加密模式,ECB 還是 CBC?如果你對所有這些問題都沒有答案,也沒有好的理由,那么你可能發現你正處在一個微妙的位置,雖然你擁有所有你想要的工具,但是你一點兒都不確定使 用哪個、如何使用。
這正是 傻瓜密碼學工具包 發揮作用的場景。這些工具包并沒有實現任何奇特的加密功能,也沒有嘗試替代任一上述的密碼學庫;相反它們基于這些類庫構建,唯一的目的是使得使用加密功能更簡單更安全。
與通用密碼學庫相反,這些工具包通常只支持一部分算法、模式、結構、參數。對于通用加密工具需要設定的部分,這些工具包為你提供了 合理的默認值 ,以防你知道想要什么,但是不知道如何使用,或者只在乎最終有個安全的解決方案。讓我們檢查幾個這類工具包以便來更好的理解它們的運行規則。
Keyczar
Keyczar 是一組開源工具包,最初由兩位 Google Security Team(谷歌安全團隊)成員開發。 它用 Java,Python 和 C++ 語言實現。它支持對稱加密和費堆成加密兩種鑒權方式。Keyczar 提供安全的默認設定,包括算法,秘鑰長度和模式,秘鑰循環和版本化,初始向量(vector)和授權碼自動生成,支持國際化。該工具包基于JCE構建, ( here ),使用了Spongy Castle的安全提供程序。
AeroGear Crypto
AeroGear Crypto 是 AeroGear 提供的一個小的 Java 庫。 它支持可認證的對稱加密,橢圓曲線加密,基于密碼的秘鑰推導。它也提供了算法的顯式設定。AeroGear Crypto 在 android 平臺依賴Spongy Castle,在其他平臺上依賴 Bouncy Castle。該庫在 iOS,Windows Phone 和 Cordova 上同樣可用。
Conceal
為了能夠快速并使用很少內存對SD卡上的大型文件實現加密和認證,臉譜開發出了 Conceal。 Conceal 既可以進行認證,也可以進行加密,同時默認也提供了密鑰管理功能。它使用的是 OpenSSL,不過僅包含自己需要的那部分,因此其大小僅為 85KB。Conceal 站點上公布的結果顯示它優于 Bouncy Castle。
下表對上面所介紹的加密庫做了總結。請注意:上面介紹的所有的庫可以讓加密方面的新手安全地進行加密,不過高級開發人員可以不使用這些默認做法,可以按照自己的意愿指定所有的加密細節(就像他們在使用其他加密庫那樣)。
加密庫 | 開發公司 | 許可證 |
---|---|---|
AeroGear Crypto | AeroGear | Apache 2.0 |
Conceal | 非死book | BSD |
Keyczar | – | Apache 2.0 |
總結(To sum up)
如果你是一個移動應用開發者,你得花時間(精力)使你的應用程序便于使用,功能豐富,抓人眼球,但是,你不要忘了改善你應用的安全性。如果你不懂怎么著 手,或者擔心做不對,那就從文中提到的工具包中選擇一個,以便能夠開始。不管你決定選用哪個加密工具都好,都應避免自己實現加密算法和加密協議; 應該只 使用那些廣泛應用的,普遍認可的,經受考驗的算法和協議。