微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于相互认证的 AES256 密码交换 - 客户端 - 服务器之间的不同加密结果

如何解决用于相互认证的 AES256 密码交换 - 客户端 - 服务器之间的不同加密结果

我正在尝试修复在对我们的应用程序进行渗透测试期间出现的一个严重错误
环境:一个旧的 Gupta/sql Windows 桌面应用程序,需要 java webapp(托管在 IBM WebSphere 上)的支持才能在 CICS 上操作 db/communicate;在渗透测试期间,我们能够扮演一个中间人并嗅探/发送命令到 java web 应用程序,获得对数据库的完全访问权限。

作为修复,我考虑在客户端和服务器之间实现相互身份验证;不幸的是,我们不能使用 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 };
        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 应用进行加密:
IDEd+plt5wmPTyZhqvGMgbKc9djCrJLjsZeGlYnjO8A=

注意:在桌面应用程序中,我们使用 CryptEncrypt 类来执行加密,但似乎不是密码选项中的 Salt。

我不是 AES256 专家,哪个参数给了我们不同的结果?盐? iv? 我也很欣赏一些指向 doc 的链接,我发现的所有内容都是关于 AES 的“商业”文章,我需要一些东西来理解 salt-iv

非常感谢!


编辑:如果我们在双方使用不同的 Salt/IV,我们将能够加密/解密字符串?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?