我一直在绞尽脑汁地想通过使用安全飞地和 JDBC 的 ms sql server Always Encryption 来集成类似的操作
我在表(学生)上有一个使用随机加密的加密列(名称),并且能够使用 SSMS 使用以下查询来获取解密的数据
声明 @name char(200) = 'stack%'; 从学生中选择姓名、科目,其中姓名类似于@姓名;
要执行上述脚本,我已启用“始终加密”并将“启用安全飞地”和“飞地证明协议”设置为“无”
[![证明][1]][1]
还添加了列加密设置=已启用
[![列加密设置][2]][2]
我正在使用 JDBC 应用程序连接到加密数据库
连接字符串:jdbc:sqlserver://server:port;databaseName=database;SelectMethod=cursor;columnEncryptionSetting=Enabled;enclaveAttestationUrl=null;enclaveAttestationProtocol=NONE
下面是获取数据的代码
String sql = "DECLARE @name char(200) = 'stack%'; "
+ "SELECT name FROM Student WHERE name LIKE @name;";
DatabaseManager db = null;
ResultSet rs = null;
List list = new ArrayList();
try {
db = getDatabaseManager();
rs = db.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString("CustomerName_1"));
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (db != null) {
db.close();
db = null;
}
}
````
But when running the application, I am unable to get the data and encountering the below exception
***Encryption scheme mismatch for columns/variables '@CustomerName_1'. The encryption scheme for the columns/variables is (encryption_type = 'PLAINTEXT') and the expression near line '1' expects it to be Randomized, , a BIN2 collation for string data types, and an enclave-enabled column encryption key, or PLAINTEXT.***
It is killing my time almost and any help would be appreciable and helpful
[1]: https://i.sstatic.net/W83djZwX.png
[2]: https://i.sstatic.net/BHg0cCkz.png
您误解了加密的工作原理。查询必须在“外部”进行参数化,但您将整个查询传递到 SQL Server,它不再能够访问加密密钥。
您需要使用:PreparedStatement 并将 @name 变量作为参数发送(如果 SSMS 正在做什么)。您的 java 代码需要能够访问 enclave。请参阅https://learn.microsoft.com/en-us/sql/connect/jdbc/using-always-encrypted-with-secure-enclaves-with-the-jdbc-driver?view=sql-server-ver16