我试图加载一些库“.so”/.dll”文件使用下面的代码
System.load("some file");
然后,在使用checkmarx工具执行静态应用程序安全测试(sast)之后,它抱怨下载的代码没有完整性检查问题。
然后,我试图修复下载的代码没有完整性检查sast问题使用校验和
我使用sha-512算法生成了一个库文件校验和,并将其保持在字符串常量中
public static final String TRUSTED_SHA512 = "12af30d9ffc1cdd85d21e73c8c81b7c379a9b4ab2ea5676cd9d232788e2b44fbab876796104f37d0f6a5f7bc5f97eb3663e432785b94039b5320bbfac3d19516";
现在,在加载文件之前,我用相同的算法再次计算hash,并用字符串常量trusted\u sha512检查它
MessageDigest md = MessageDigest.getInstance("SHA-512");
String sha512ofQrcToolsWrapper = ChecksumHelper.getFileChecksum(md,temp);
if(sha512ofQrcToolsWrapper.equalsIgnoreCase(ServiceConstants.TRUSTED_SHA512_OF_QRCTOOLSWRAPPER)) {
System.load(temp.getAbsolutePath());
}else{
throw new Exception("failed to load windows dll file : Checksum mismatched");
}
现在checkmarx工具提供了一个没有salt的单向散列的用法,然后我用静态salt值更新了消息摘要。使用fix salt value而不是random value的原因是,我们希望在运行时计算相同的哈希值,以检查常量中已经存在的哈希值
public static String getFileChecksum(MessageDigest digest, File file) throws IOException, NoSuchAlgorithmException {
//Get file input stream for reading the file content
FileInputStream fis = new FileInputStream(file);
//Create byte array to read data in chunks
byte[] byteArray = new byte[1024];
int bytesCount = 0;
//Read file data and update in message digest
while ((bytesCount = fis.read(byteArray)) != -1) {
digest.update(byteArray, 0, bytesCount);
}
//Static salt value
digest.update(getSalt());
//close the stream; We don't need it now.
fis.close();
//Get the hash's bytes
byte[] bytes = digest.digest();
//This bytes[] has bytes in decimal format;
//Convert it to hexadecimal format
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
//return complete hash
return sb.toString();
}
注意“getsalt()方法正在返回具有固定值的字节数组”
不过,萨斯特还是在抱怨这两个问题
下载没有完整性检查的代码
使用不含盐的单向散列
请提供解决这些问题的方案。如果还有什么需要澄清的,请告诉我。
提前谢谢
暂无答案!
目前还没有任何答案,快来回答吧!