一次發三篇,希望我明天不要再偷懶了ˊˇˋ。
下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
,這導致攻擊者很容易透過字典檔攻擊解密由這個演算法加密的密文public class SymmetricCipherTest {
public static void main() {
byte[] text ="Secret".getBytes();
byte[] iv ={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(56);
SecretKey key = kg.generateKey();
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ips);
return cipher.doFinal(inpBytes);
}
}
Base64.getEncoder().encodeToString(IV.getBytes());
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:
使用了 IV.getBytes()
將初始化向量IV
轉換為字節陣列,然後再對它進行 Base64 編碼,IV
是一個固定值或硬編碼的字串,導致相同的IV
在多次加密中重複使用,這使加密結果容易受到攻擊。
Base64.getEncoder().encodeToString(se.getIv());
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:se.getIv()
是通過加密庫的安全隨機數生成器生成的,這將提升加密的安全性,因為每次加密時都會生成一個新的隨機IV
,從而避免了重複使用相同的IV
。
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.BLOCK_MODE_CTR)
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:BLOCK_MODE_GCM
和 BLOCK_MODE_CTR
是兩種不同的塊加密模式,但在同一個加密操作中,這兩者是不能同時使用的。
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:
因為 GCM 模式本身是一種不需要填充的模式。這樣可以避免因為不必要的填充而造成的潛在錯誤。