Android 檔案的加密及解密
阿新 • • 發佈:2019-02-17
檔案加密及解密
1. 保護隱私資料不被未授權訪問; 什麼是加密 1. 保護隱私資料不被未授權訪問; 2. 用於隱藏真實資料,進行安全的資料傳遞; 3. 避免資料被第三方截獲; 2. 用於隱藏真實資料,進行安全的資料傳遞; 3. 避免資料被第三方截獲; 古代加密方式:置換(反序,替換) 加密演算法的歷史 古代加密方式:置換(反序,替換) 現代加密演算法:帶密碼的加密、兩套密碼的加密、動態密碼加密。 現代加密:對稱加密、非對稱加密 現代加密演算法:帶密碼的加密、兩套密碼的加密、動態密碼加密。 現代加密:對稱加密、非對稱加密 1. 能否通過一個密碼進行加密和解密的操作,如果能就是對稱加密。 對稱加密 1. 能否通過一個密碼進行加密和解密的操作,如果能就是對稱加密。 2. 對稱加密都有密碼。 3. 常用的加密方式DES, AES 2. 對稱加密都有密碼。 3. 常用的加密方式DES, AES DES 加密演算法 說明 DES 通過密碼,對資料進行大量迴圈方式的異或 操作,從而生成加密後的資料。 DES對資料依次進行加密,一次加密是8個位元組一起 因此,DES密碼,必須是64bit,也就是8個位元組 DES加密實現 1. DES加密之後的資料,不能夠直接生成字串的; 2. 加密: M 明文, K 12345678, D 加密後資料 D = DES(M, K) 用K密碼對M進行加密生成D 3. 解密:M = DES(D, K) 4. 這種可以通過相同的密碼進行加密和解密的叫做對稱加密。 DES API 1. Cipher 加密/解密引擎,用於實際的處理 2. cipher.init(int mode, Key key) 設定加密還是解密 3. Key 對於DES需要使用 SecretKeyFactory 進行密碼建立 建立密碼物件用的是 DESKeySpec 4. Cipher update(byte[]) 每次呼叫都會返回一部分處理的資料,DES API doFinal 就只能返回最後一次的資料,不是完整的, 5. DES 加密推薦使用 doFinal 來完成。 DESede 加密方式 對於DES 或者 DESede 而言,如果實現DESede的話,那麼:Cipher 演算法調整為 DESede,SecretKeyFactory制定的演算法,同樣調整為 DESede, 其中需要使用 DESedeKeySpec 生成密碼,而且密碼的長度 24個位元組。 AES 加密演算法 特點 1. 速度快 2. 強度高 3. Java中預設支援 AES 128bit 加密 AES 256bit 美國軍方的標準; AES 256bit 需要美國出口許可證才可以用。 DES, AES 特性 - 分塊加密 Padding: 加密的時候,分塊是資料按照固定長度一塊一塊處理,可以通過 Cipher 引數進行分塊的控制 NoPadding:如果資料不是塊長度的倍數,那麼不會填充 一般情況下,填充會自動向資料後面新增 位元組0 補齊 AES 常用的Cipher演算法 1. AES 預設可以使用,有時也會出現BadPaddingException,不建議使用 2. AES/ECB/PKCS5Padding 另外一種AES 加密形式,建議使用 3. AES/CBC/PKCS5Padding 內部的演算法模式不同。 4.演算法及密碼長度限制 演算法/模式/填充 16位元組加密後資料長度 不滿16位元組加密後長度 AES/CBC/NoPadding 16 不支援 AES/CBC/PKCS5Padding 32 16 AES/CBC/ISO10126Padding 32 16 AES/CFB/NoPadding 16 原始資料長度 AES/CFB/PKCS5Padding 32 16 AES/CFB/ISO10126Padding 32 16 AES/ECB/NoPadding 16 不支援 AES/ECB/PKCS5Padding 32 16 AES/ECB/ISO10126Padding 32 16 AES/OFB/NoPadding 16 原始資料長度 AES/OFB/PKCS5Padding 32 16 AES/OFB/ISO10126Padding 32 16 AES/PCBC/NoPadding 16 不支援 AES/PCBC/PKCS5Padding 32 16 AES/PCBC/ISO10126Padding 32 16 AES API 1. Cipher 加密/解密引擎 2. 建立密碼生成器 KeyGenerator,設定密碼生成的密碼長度 128 bit和裝置安全隨機數 , 如keyGenerator.init(128, new SecureRandom(password.getBytes())); 3.生成 SecretKey keyGenerator.generateKey() 4. 初始化 引擎 cipher.init(Cipher.ENCRYPT_MODE, secretKey) 5. 加密處理 cipher.doFinal(byte[] origData) 非對稱加密演算法 加密實現 1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001 2. C = M ^ E mod n 3. M = C ^ D mod n 4. 通常 E + n 作為 私鑰隱祕儲存 5. 通常 D + n 作為公鑰,可以給任何人。 6. 通過 C ^ D mon => M 7. E 通過計算兩個 1024bit 以上的整數(並且是素數), 公鑰 D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數 D 安全性足夠高 非對稱加密的API 1. Cipher 可以進行加密,用的是 “RSA”, “DSA” 2. KeyPairGenerator 生成 公鑰和私鑰 3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。 加密實現 1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001 2. C = M ^ E mod n 3. M = C ^ D mod n 4. 通常 E + n 作為 私鑰隱祕儲存 5. 通常 D + n 作為公鑰,可以給任何人。 6. 通過 C ^ D mon => M 7. E 通過計算兩個 1024bit 以上的整數(並且是素數), 公鑰 D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數 D 安全性足夠高 非對稱加密的API 1. Cipher 可以進行加密,用的是 “RSA”, “DSA” 2. KeyPairGenerator 生成 公鑰和私鑰 3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。 Base64、MD5編碼 android.util.Base64類 encode(byte[],flag) encodeToString(byte[],flag) 編碼並轉換成字串 decode(byte[],flag) 解碼 flags標識 Base64.DEFAULT 預設,如果字串過長(超過76)時自動在中間加一個換行符,字串最後也會加一個換行符。可能會導致和其他模組對接時結果不一致,建議使用Base64.NO_WRAP Base64.NO_WRAP 不換行處理 Base64.NO_PADDING 結束位置省略“==” it.sauronsoftware.base64.Base64類 第三方Base64編碼、解碼工具類 Base64.decode(byte[]); Base64.encode(byte[]) MD5 java.security.MessageDigest MD5加密:
1. 保護隱私資料不被未授權訪問; 什麼是加密 1. 保護隱私資料不被未授權訪問; 2. 用於隱藏真實資料,進行安全的資料傳遞; 3. 避免資料被第三方截獲; 2. 用於隱藏真實資料,進行安全的資料傳遞; 3. 避免資料被第三方截獲; 古代加密方式:置換(反序,替換) 加密演算法的歷史 古代加密方式:置換(反序,替換) 現代加密演算法:帶密碼的加密、兩套密碼的加密、動態密碼加密。 現代加密:對稱加密、非對稱加密 現代加密演算法:帶密碼的加密、兩套密碼的加密、動態密碼加密。 現代加密:對稱加密、非對稱加密 1. 能否通過一個密碼進行加密和解密的操作,如果能就是對稱加密。 對稱加密 1. 能否通過一個密碼進行加密和解密的操作,如果能就是對稱加密。 2. 對稱加密都有密碼。 3. 常用的加密方式DES, AES 2. 對稱加密都有密碼。 3. 常用的加密方式DES, AES DES 加密演算法 說明 DES 通過密碼,對資料進行大量迴圈方式的異或 操作,從而生成加密後的資料。 DES對資料依次進行加密,一次加密是8個位元組一起 因此,DES密碼,必須是64bit,也就是8個位元組 DES加密實現 1. DES加密之後的資料,不能夠直接生成字串的; 2. 加密: M 明文, K 12345678, D 加密後資料 D = DES(M, K) 用K密碼對M進行加密生成D 3. 解密:M = DES(D, K) 4. 這種可以通過相同的密碼進行加密和解密的叫做對稱加密。 DES API 1. Cipher 加密/解密引擎,用於實際的處理 2. cipher.init(int mode, Key key) 設定加密還是解密 3. Key 對於DES需要使用 SecretKeyFactory 進行密碼建立 建立密碼物件用的是 DESKeySpec 4. Cipher update(byte[]) 每次呼叫都會返回一部分處理的資料,DES API doFinal 就只能返回最後一次的資料,不是完整的, 5. DES 加密推薦使用 doFinal 來完成。 DESede 加密方式 對於DES 或者 DESede 而言,如果實現DESede的話,那麼:Cipher 演算法調整為 DESede,SecretKeyFactory制定的演算法,同樣調整為 DESede, 其中需要使用 DESedeKeySpec 生成密碼,而且密碼的長度 24個位元組。 AES 加密演算法 特點 1. 速度快 2. 強度高 3. Java中預設支援 AES 128bit 加密 AES 256bit 美國軍方的標準; AES 256bit 需要美國出口許可證才可以用。 DES, AES 特性 - 分塊加密 Padding: 加密的時候,分塊是資料按照固定長度一塊一塊處理,可以通過 Cipher 引數進行分塊的控制 NoPadding:如果資料不是塊長度的倍數,那麼不會填充 一般情況下,填充會自動向資料後面新增 位元組0 補齊 AES 常用的Cipher演算法 1. AES 預設可以使用,有時也會出現BadPaddingException,不建議使用 2. AES/ECB/PKCS5Padding 另外一種AES 加密形式,建議使用 3. AES/CBC/PKCS5Padding 內部的演算法模式不同。 4.演算法及密碼長度限制 演算法/模式/填充 16位元組加密後資料長度 不滿16位元組加密後長度 AES/CBC/NoPadding 16 不支援 AES/CBC/PKCS5Padding 32 16 AES/CBC/ISO10126Padding 32 16 AES/CFB/NoPadding 16 原始資料長度 AES/CFB/PKCS5Padding 32 16 AES/CFB/ISO10126Padding 32 16 AES/ECB/NoPadding 16 不支援 AES/ECB/PKCS5Padding 32 16 AES/ECB/ISO10126Padding 32 16 AES/OFB/NoPadding 16 原始資料長度 AES/OFB/PKCS5Padding 32 16 AES/OFB/ISO10126Padding 32 16 AES/PCBC/NoPadding 16 不支援 AES/PCBC/PKCS5Padding 32 16 AES/PCBC/ISO10126Padding 32 16 AES API 1. Cipher 加密/解密引擎 2. 建立密碼生成器 KeyGenerator,設定密碼生成的密碼長度 128 bit和裝置安全隨機數 , 如keyGenerator.init(128, new SecureRandom(password.getBytes())); 3.生成 SecretKey keyGenerator.generateKey() 4. 初始化 引擎 cipher.init(Cipher.ENCRYPT_MODE, secretKey) 5. 加密處理 cipher.doFinal(byte[] origData) 非對稱加密演算法 加密實現 1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001 2. C = M ^ E mod n 3. M = C ^ D mod n 4. 通常 E + n 作為 私鑰隱祕儲存 5. 通常 D + n 作為公鑰,可以給任何人。 6. 通過 C ^ D mon => M 7. E 通過計算兩個 1024bit 以上的整數(並且是素數), 公鑰 D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數 D 安全性足夠高 非對稱加密的API 1. Cipher 可以進行加密,用的是 “RSA”, “DSA” 2. KeyPairGenerator 生成 公鑰和私鑰 3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。 加密實現 1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001 2. C = M ^ E mod n 3. M = C ^ D mod n 4. 通常 E + n 作為 私鑰隱祕儲存 5. 通常 D + n 作為公鑰,可以給任何人。 6. 通過 C ^ D mon => M 7. E 通過計算兩個 1024bit 以上的整數(並且是素數), 公鑰 D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數 D 安全性足夠高 非對稱加密的API 1. Cipher 可以進行加密,用的是 “RSA”, “DSA” 2. KeyPairGenerator 生成 公鑰和私鑰 3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。 Base64、MD5編碼 android.util.Base64類 encode(byte[],flag) encodeToString(byte[],flag) 編碼並轉換成字串 decode(byte[],flag) 解碼 flags標識 Base64.DEFAULT 預設,如果字串過長(超過76)時自動在中間加一個換行符,字串最後也會加一個換行符。可能會導致和其他模組對接時結果不一致,建議使用Base64.NO_WRAP Base64.NO_WRAP 不換行處理 Base64.NO_PADDING 結束位置省略“==” it.sauronsoftware.base64.Base64類 第三方Base64編碼、解碼工具類 Base64.decode(byte[]); Base64.encode(byte[]) MD5 java.security.MessageDigest MD5加密: