iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 23

J - weak crypto algorithm (不合標準的密碼術:使用不安全/已棄用的演算法)

  • 分享至 

  • xImage
  •  

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

J - weak crypto algorithm(不合標準的密碼術:使用不安全/已棄用的演算法)

  • 形成原因:系統或應用程式仍使用已知漏洞或已棄用的加密演算法,如 MD5 或 SHA-1、3DES 等未及時更新加密技術。
  • 後果:這些演算法加密強度不足,容易透過暴力破解工具、網路上已知彩虹表破解,導致敏感信息泄露。
  • 實例:已知線上網路破解網站(目前支援 md5、sha1、mysql、ntlm) https://www.cmd5.com/
  • 解決方法:
    1. 開發者首先識別需要保護的敏感數據
    2. 使用適當的強標準算法和強密鑰
    3. 實施全範圍的密鑰管理
    4. 密碼使用強標準算法進行雜湊處理,並使用適當的隨機鹽值

第1題

錯誤區塊

Message msg = new Message(receiverName, Message.Type.chat);
msg.setBody(encryptOrDecryptXOR(message, receiverName));
if (connection != null) {
    connection.sendPacket(msg);
    return true;
}else{
    return false;
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
xor不是一個安全的加密演算法

主要修正方法

public boolean sendMessage(String receiverName, String message, String type) {
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("type", type);
            if(type.equals("key")){
                jsonObject.put("data", message);
            }else {
                Cipher cipher = Cipher.getInstance(RSAEncryption.getInstance(mContext).getAlgorithm());
                cipher.init(Cipher.ENCRYPT_MODE, RSAEncryption.loadPublicKeyFromString(receiverPublicKey));
                jsonObject.put("data",new String(cipher.doFinal(message.getBytes())));
            }
            Message msg = new Message(receiverName, Message.Type.chat);
            msg.setBody(jsonObject.toString());
            if (connection != null) {
                connection.sendPacket(msg);
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            if (BuildConfig.DEBUG) {
                e.printStackTrace();
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:使用安全的RSA加密演算法,並確保只有在處於開發模式,且捕獲異常時才會打印出錯誤的詳細堆棧訊息,避免將詳細的錯誤信息暴露給最終用戶或生產環境。

第2題

錯誤區塊

KeyProperties.KEY_ALGORITHM_3DES, "AndroidKeyStore");
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:3DES也是過舊的演算法了

主要修正方法

KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:改成 RSA 或 AES256 都可以


上一篇
J - client-side authentication (不安全的身份驗證:鎖定機制脆弱)
下一篇
J - reuse of initialization vector (不合標準的密碼術:重複利用初始化向量)
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言