Heim  >  Fragen und Antworten  >  Hauptteil

MySql- und Java-Interoperabilität bei der AES 256-Verschlüsselung/Entschlüsselung

Die folgende Ver- und Entschlüsselung funktioniert normal im MySQL-Modus (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!!'
));

Ich versuche erfolglos, einen in MySQL verschlüsselten Wert zu entschlüsseln.

Das Folgende ist der Schlüssel in meiner MySQL-Abfrage sha256 (Salz+Schlüssel)

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

Gleicher Wert, den ich in Java erreichen konnte:

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

Gibt es eine benutzerdefinierte Möglichkeit, Hüpfburgen/andere APIs dazu zu bringen, denselben Schlüssel für die Entschlüsselung zu verwenden?

P粉937769356P粉937769356205 Tage vor338

Antworte allen(1)Ich werde antworten

  • P粉239089443

    P粉2390894432024-03-28 20:33:42

    MySQL内部使用OpenSSL算法,以EVP_BytesToKey作为推导函数。看看这个网址

    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
    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));
    }

    }

    这样终于实现了互操作性!希望这对尝试做同样事情的人有所帮助。

    Antwort
    0
  • StornierenAntwort