【问题标题】:MySql and Java interoperability in AES 256 encryption/decryptionAES 256 加密/解密中的 MySql 和 Java 互操作性
【发布时间】:2022-06-13 20:58:19
【问题描述】:

下面的加解密在mysql(aes-256-cbc)模式下可以正常工作

SET block_encryption_mode = 'aes-256-cbc';

select
cast(
aes_decrypt(
from_base64('StThdNXA+CWvlg+of/heJQ=='),
sha2(concat('ssshhhhhhhhhhh!!','ENCRYPTION_KEY$&'),256),
'ssshhhhhhhhhhh!!'
)
as char);

select to_base64(aes_encrypt(
'test_value',
sha2(concat('ssshhhhhhhhhhh!!','ENCRYPTION_KEY$&'),256),
'ssshhhhhhhhhhh!!'
));

我正在尝试解密在 mysql 中加密但没有运气的值。

以下是我的mysql查询中的key sha256(salt+key)

select sha2(concat('ssshhhhhhhhhhh!!','ENCRYPTION_KEY$&'),256);

我可以在 java 中得到相同的值:

Hashing.sha256().hashString("ssshhhhhhhhhhh!!ENCRYPTION_KEY$&", StandardCharsets.UTF_8).toString();

有没有一种自定义方式可以让充气城堡/其他 API 使用相同的密钥进行解密?

【问题讨论】:

    标签: java mysql hash aes bouncycastle


    【解决方案1】:

    MySQL内部使用OpenSSL算法,以EVP_BytesToKey作为推导函数 Check out this url

    MySQL加解密示例:

    SET block_encryption_mode = 'aes-128-cbc';
    SET block_encryption_mode = 'aes-256-cbc';
    select 
    cast(
        aes_decrypt(
            from_base64('MKicK+vAcZkq/g3wpTKxVg=='),
            'ENCRYPTION_KEY$&',
            'ssshhhhhhhhhhh!!'
        )
    as char);
    
    
    select to_base64(aes_encrypt(
    'test_value',
    'ENCRYPTION_KEY$&',
    'ssshhhhhhhhhhh!!'
    ));
    

    有一个 JAR 支持这个 EVP_BytesToKey 密钥派生函数。

     JAR : not-going-to-be-commons-ssl-0.3.19
    

    公共类AnotherTry {

    byte[] key = "ENCRYPTION_KEY$&".getBytes(StandardCharsets.UTF_8);
    byte[] iv = "ssshhhhhhhhhhh!!".getBytes(StandardCharsets.UTF_8);
    
    String cipher = "AES-128-CBC";
    
    @Test
    public void testEncrypt() throws Exception {
        byte[] data = "test_message".getBytes(StandardCharsets.UTF_8);
        byte[] encrypted = OpenSSL.encrypt(cipher, key, iv, data, true);
        System.out.println(new String(encrypted));
    }
    
    @Test
    public void testDecrypt() throws GeneralSecurityException, IOException {
        byte[] encrypted = "rQ8Y0ClNu5d4ODZQ3XcQtw==".getBytes(StandardCharsets.UTF_8);
        byte[] decrypted = OpenSSL.decrypt(cipher, key, iv, encrypted);
        System.out.println(new String(decrypted));
    }
    

    }

    这种方式最终实现了互操作性!希望这对尝试这样做的人有所帮助。

    【讨论】:

    • 抱歉,这个答案不正确:EVP_BytesToKey() 不是 MySQL 的 KDF。发布的代码也不是支持或反对特定 KDF 的证据,因为这两个代码根本不使用 KDF。
    • 前者可以通过比较两个 KDF(s.Evp_BytesToKey()MySQL's KDF)轻松证明。后者是因为在发布的代码中使用了 valid AES 密钥大小。因此 MySQL 直接应用密钥,因此没有 KDF(请参阅我的答案的方法 1)。 Java 代码使用overload,其中也不涉及 KDF。
    猜你喜欢
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多