硬编码AES密钥是否属于安全漏洞?求技术解析(附代码)
硬编码密钥漏洞判定与代码解析
一、是否属于硬编码密钥漏洞
这绝对属于硬编码密钥漏洞,原因如下:
- 你找到的
AES_KEY、AES_VECTOR(AES加密的密钥和初始化向量)直接以明文形式定义在Constant类的静态常量中,Java编译后的字节码会保留这些字符串,攻击者通过反编译工具就能轻松提取出这些密钥。 - 一旦密钥泄露,所有通过这些密钥加密的数据都能被直接解密,加密机制完全失去保护作用。
- 另外注意
AES_KEY_PRE的代码存在语法错误(多了一对双引号),但这不影响硬编码漏洞的判定。
二、相关代码含义解析
1. 常量类代码
package com.igen.configlib.constant; public class Constant{ public static final String AES_KEY="1111111111111111"; public static final String AES_KEY_PRE=""214028""; // 存在语法错误,多了双引号 public static final String AES_VECTOR="1111111111111111"; ... }
Constant是一个全局常量类,用来存放项目中复用的固定值。AES_KEY:AES加密算法的密钥,这里是16位字符串(对应AES-128,因为128位=16字节)。AES_VECTOR:AES-CBC模式必须的初始化向量(IV),同样是16位字符串,作用是让相同明文加密出不同密文,避免重复模式泄露信息。AES_KEY_PRE:疑似密钥前缀,但代码存在语法错误,无法正常编译。
2. 加密方法代码
public static byte[] encrypt4CBC128ByDeviceSN(String str, String str2){ String formatKeyAndVector=formayKeyAndVector(str2); return encrypt4CBC128(str, formatKeyAndVector,formatKeyAndVector) } public static byte[] encrypt4CBC128(String str){ return encrypt4CBC128(str,"1111111111111111","1111111111111111") }
encrypt4CBC128(String str):AES-CBC-128加密的重载方法,直接传入硬编码的密钥和IV,对输入字符串str进行加密,返回加密后的字节数组——这就是漏洞的核心触发点。encrypt4CBC128ByDeviceSN(String str, String str2):相对安全的加密方法,它接收设备序列号str2,通过formayKeyAndVector方法将序列号处理成符合要求的密钥和IV,再用这个动态生成的值加密字符串str,避免了硬编码密钥的风险。
3. 解密方法代码
public static byte[] decrypt4CBC128ByDeviceSN(byte[] bArr, String str){ String formatKeyAndVector=formayKeyAndVector(str); return decrypt4CBC128(str, formatKeyAndVector,formatKeyAndVector) } public static byte[] decrypt4CBC128(byte[] bArr){ return decrypt4CBC128(bArr,"1111111111111111","1111111111111111") }
decrypt4CBC128(byte[] bArr):对应加密方法的重载解密方法,直接用硬编码的密钥和IV解密输入的字节数组bArr,同样存在硬编码漏洞。decrypt4CBC128ByDeviceSN(byte[] bArr, String str):用设备序列号生成的密钥和IV解密字节数组bArr,和对应的加密方法匹配,安全性更高。
内容的提问来源于stack exchange,提问作者Not a Salmon Fish
相关产品推荐
相关产品推荐

