資源描述:
《android應(yīng)用安全開發(fā)之淺談加密算法的坑》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、Android應(yīng)用安全開發(fā)之淺談加密算法的坑作者:阿里移動安全@伊樵,@舟海阿里聚安全,一站式解決應(yīng)用開發(fā)安全問題Android開發(fā)屮,難免會遇到需要加解密一些數(shù)據(jù)內(nèi)容存到木地文件、或者通過網(wǎng)絡(luò)傳輸?shù)狡渌?wù)器和設(shè)備的問題,但并不是使用了加密就絕對安全了,如杲加密函數(shù)使用不正確,加密數(shù)據(jù)很容易受到逆向破解攻擊。還冇很多開發(fā)者沒冇意識到的加密算法的問題。1、需要了解的基本概念密碼學(xué)的三大作用:加密(Encryption)、認證(Authentication),鑒定(Identification)加密:防止壞人獲取你的數(shù)據(jù)。認證:防止壞人修改了你的數(shù)據(jù)而你卻并沒有發(fā)現(xiàn)
2、。鑒權(quán):防止壞人假冒你的身份。明文、密文、密鑰、對稱加密算法、汕對稱加密算法,這些基本概念和加密算法原理就不展開敘述了。2、AndroidSDK提供的API2.1Android加密相關(guān)API結(jié)構(gòu)AndroidSDK使用的API和JAVA提供的基本相似,山JavaCryptographyArchitecture(JCA,java加密體系結(jié)構(gòu)),JavaCryptographyExtension(JCE,Java加密擴展包),JavaSecureSocketsExtension(JSSE,Java安全套接字擴展包),JavaAuthenticationandAuthe
3、nticationService(JAAS,Java鑒別與安全服務(wù))組成。JCA提供基本的加密框架,如證卩、數(shù)字簽名、消息摘要和密鑰對產(chǎn)生器,對應(yīng)的AndroidAPI中的以下兒個包:java.securityjava?security?actjava?security?certjava?secu廠Vty?"irvterfacesjava?security?specJCE擴展了JCA,提供了各種加密算法、摘要算法、密鑰管理等功能,對應(yīng)的AndroidAPI中的以下兒個包:javax.cryptojavax.crypto.interfacesjavax.crypto
4、.specJSSE提供了SSL(基于安全套接層)的加密功能,使用HTTPS加密傳輸使用,對應(yīng)的AndroidAPI主要是java.net.ssl包屮。JAAS提供了在Java平臺上進行用戶身份鑒別的功能。對應(yīng)的AndroidAPI主要在以下兒個包:javax.security.authjavax.security.auth」oginjavax.security.auth.callbackjavax.security.auth.x500它們其實只是一組接口,實際的算法是可由不同的Provider提供,AndroidAPI默認的Provider主要是是BouncyCa
5、stle和OpenSSL。此外AndroidAPI還提供了android.security和android.security.keystore(API23新增)來管理keychain和keystore□2.2Base64編碼算法Base64編碼算法是—?種用64個字符(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzOI23456789+/)來表示任意二進制數(shù)據(jù)的方法。在計算機網(wǎng)絡(luò)發(fā)展的早期,由于“歷史原因”,屯子郵件不支持非ASCII碼字符,如果耍傳送的電子郵件帶有非ASCII碼字符(諸如屮文)或者圖片,用
6、戶收到的電子郵件將會是一堆亂碼,因此發(fā)明了Base64編碼算法。至于為何會亂碼?請大家自行Google。在加解密算法屮,原始的數(shù)據(jù)和加密后的數(shù)據(jù)一般也是二進制數(shù)據(jù),為了不傳輸出錯,方便保存或者調(diào)試代碼,一般需要對加密后的數(shù)據(jù)進行base64編碼。Android提供了Base64編碼的工具類android.util.Base64,可以直接使用,不用自己去實現(xiàn)base64編碼的算法了。如:[]output=sha.digest();Stringresult二Base64.encodeToString(output,Base64.DEFAULT);開發(fā)者建議:base6
7、4只是一種編碼方式,并不是一種加密算法,不要使用base64來加密數(shù)據(jù)。2.3隨機數(shù)生成器在Android加密算法中需要隨機數(shù)時要使用SecureRandom來獲取隨機數(shù)。如:SecureRandomsr=SecureRandom();byte[]output=mb/te[16];sr?nextBytes(output);注意不要給SecureRandom設(shè)置種子。調(diào)用seededconstructor或者setSeed(byte[])是不安全的。SecureRandom()默認使用的是dev/urandom作為種子產(chǎn)生器,這個種子是不可預(yù)測的。開發(fā)者建議:1、不
8、要使用Ra