【问题标题】:migrating encrypted data to Sql server from MYSQL server将加密数据从 MYSQL 服务器迁移到 Sql 服务器
【发布时间】:2018-04-09 14:29:14
【问题描述】:

我们对其中一个表中的某些数据进行了 aes-256 加密,我们正在将其迁移到 sql server。问题是由于不兼容,我们无法解密 sql server 中的数据。有什么方法可以以与 sql server 兼容的方式加密 MYSQL 中的数据。有什么建议吗?

【问题讨论】:

  • 那你必须在 MySQL 中解密,移动它并以与 SQLServer 兼容的方式重新加密
  • 嗯,这不是我正在寻找的答案@RiggsFolly。数据很敏感,不能在未加密的情况下即时发送。
  • 我知道这不是答案,所以我把它放在评论中
  • 如果您告诉我们更多关于这些不兼容性的内容,这可能会很有用。那么也许我们对你更有用。
  • 在 MYSQL 中,我们使用 encryption_mode = 'aes-256-cbc'; 加密数据。现在我们将数据传输到 sql server 然后在那里解密,但它与 sql server 不兼容,所以不要解密。我正在寻找如何加密MYSQL中的数据,当加载到sql server时可以通过sql语句解密并提供所需的密钥。

标签: mysql sql sql-server encryption


【解决方案1】:

如果您知道密钥,则可以解密数据,请参见以下 AES-256 加密和解密代码。代码是用JAVA编写的 检查此链接AES-256 Password Based Encryption/Decryption in Java

import java.security.AlgorithmParameters;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

public class EncryptionDecryption {

    private static String salt;
    private static int iterations = 65536  ;
    private static int keySize = 256;
    private static byte[] ivBytes;

    private static SecretKey secretKey;

    public static void main(String []args) throws Exception {

        salt = getSalt();

        char[] message = "PasswordToEncrypt".toCharArray();
        System.out.println("Message: " + String.valueOf(message));
        System.out.println("Encrypted: " + encrypt(message));
        System.out.println("Decrypted: " + decrypt(encrypt(message).toCharArray()));
    }

    public static String encrypt(char[] plaintext) throws Exception {
        byte[] saltBytes = salt.getBytes();

        SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        PBEKeySpec spec = new PBEKeySpec(plaintext, saltBytes, iterations, keySize);
        secretKey = skf.generateSecret(spec);
        SecretKeySpec secretSpec = new SecretKeySpec(secretKey.getEncoded(), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretSpec);
        AlgorithmParameters params = cipher.getParameters();
        ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV();
        byte[] encryptedTextBytes = cipher.doFinal(String.valueOf(plaintext).getBytes("UTF-8"));

        return DatatypeConverter.printBase64Binary(encryptedTextBytes);
    }

    public static String decrypt(char[] encryptedText) throws Exception {

        System.out.println(encryptedText);

        byte[] encryptedTextBytes = DatatypeConverter.parseBase64Binary(new String(encryptedText));
        SecretKeySpec secretSpec = new SecretKeySpec(secretKey.getEncoded(), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretSpec, new IvParameterSpec(ivBytes));

        byte[] decryptedTextBytes = null;

        try {
            decryptedTextBytes = cipher.doFinal(encryptedTextBytes);
        }   catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }   catch (BadPaddingException e) {
            e.printStackTrace();
        }

        return new String(decryptedTextBytes);

    }

    public static String getSalt() throws Exception {

        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        byte[] salt = new byte[20];
        sr.nextBytes(salt);
        return new String(salt);
    }
}

【讨论】:

  • MYSQL表中的数据使用aes-256加密。当我们将此数据移动到 sql server 时,我们无法解密它,因为 sql server 不支持此方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多