我正在尝试修复在对我们的应用程序进行渗透测试期间出现的一个严重错误。
环境:一个旧的 Gupta/SQL Windows 桌面应用程序,需要 java webapp(托管在 IBM WebSphere)的支持才能在 CICS 上运行 db/communicate;在渗透测试期间,我们能够扮演中间人,嗅探/发送命令到 java webapp,获得对数据库的完全访问权限。
作为修复,我考虑过在客户端和服务器之间实现相互身份验证;不幸的是,我们不能使用 TLS / 2-way-ssl,因为 Gupta 不支持它。(正如 Gupta 开发人员所说,我是 java 的)。所以我们正在尝试实现一个更简单的 MA,在客户端和服务器之间的每笔交易中添加一个加密密码(“随机”加密静态文本 + 时间戳),以便在每次交易中解密和验证。
问题出在这里:在我们的实际测试中,两个应用程序在不同的输出中加密相同的字符串
这是我的 aes256 加密器,密码由字符串 + 固定盐生成
private static final String SECRET_KEY = "PasswordTest123";
private static final String SALT = "sssshhh!";
public static void main(String[] args) {
TestTest asd = new TestTest();
System.out.println(asd.encrypt("TestStringTestString10:45:12"));
}
public static String encrypt(String strToEncrypt) {
try {
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
// we're on java 7 and "PBKDF2WithHmacSHA256" seems not available, got exception
// SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(SECRET_KEY.toCharArray(), SALT.getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
byte[] message = cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8));
String s = new String(message);
System.out.println(s);
String encoded = DatatypeConverter.printBase64Binary(message);
return encoded;
} catch (Exception e) {
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
输出:
R_.m]wcý7uÒ¨Im„çYSç.?®ôZ†»Y
Ul8uf21dd2P9Azd10qgOSW2E51lT5y4/rvQIWoa7WRY=
这里 Gupta/SQL Windows 应用程序使用相同的密码/参数进行加密:
lDEd+PLT5wmPTyZhqvGMgbKc9djCrJLjsZeGlYnjO8A=
注意:在桌面应用程序中,我们使用 CryptEncrypt 类来执行加密,但似乎不是来自密码选项的 Salt。
我不是 AES256 专家,这是给我们带来不同结果的参数?盐?四?我也很感激一些文档链接,我发现的所有内容都是关于 AES 的“商业”文章,我需要一些东西来理解 salt-iv
非常感谢!
编辑:如果我们在两边都使用不同的 Salt/IV,我们将能够加密/解密字符串?