2016-06-03 13 views
0

Ich muss eine Abfrage analysieren, die ein Benutzer eingibt, sagen in einem Textfeld, und was ich brauche, ist, dass ich alle Werte in der Abfrage verschlüsseln will, die Abfrage Schlüsselwörter verlassen. Um es in eine äquivalente Abfrage zu konvertieren, die in einer verschlüsselten Datenbank ausgeführt werden kann.
Wie,MySQL Query Parsing mit Java

select name from employee where salary = 10000 

Ich brauche eine äquivalente Abfrage,

select name_enc from employee_enc where salary_enc = 10000_enc 

wo name_enc, employee_enc, salary_enc und 10000_enc sind die verschlüsselten Werte von name, employee, salary und 10000. Ich muss dies in Java tun und die Datenbank, die ich benutze, ist MySQL Server, wo die Tabelle Employee bereits verschlüsselt ist.

Bitte geben Sie alle notwendigen Hilfe. Danke im Voraus.

+1

10000_enc dies nicht getan werden kann, weil 10000_enc keine Zahl ist – mubeen

+1

SELECT name_enc FROM employee_enc WHERE salary_enc = 10000_enc' ... Also, die Spaltennamen sind verschlüsselt? –

+1

dieser Link ist genau das, was Sie brauchen https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html –

Antwort

0

Wenn Sie dies nicht manuell tun müssen, verwenden Sie die SQL-Verschlüsselung und Kodierung.

Wenn Sie dies tun müssen, teilen Sie Ihre SQL-Abfragezeichenfolge manuell mit Leerzeichen und ignorieren Sie SQL-Schlüsselwörter, während Sie die Schleife verschlüsseln. Denken Sie daran, Ihre Verschlüsselungsergebnisse mit Base 64 oder Hex zu codieren, um die Datenintegrität sicherzustellen.

private String encryptSQLQuery(String plainSQLQuery){ 
    StringBuilder cipherQuery = new StringBuilder(); 
    String plainQuery = plainSQLQuery; 
    String[] splitQuery = plainQuery.split("\\s+"); 
    for(String queryWord : splitQuery){ 
     if(!isSQLKeyWord(queryWord)) 
      queryWord = cryptoObject.encryptAndEncode(queryWord); 
     cipherQuery.append(queryWord); 
     cipherQuery.append(" "); 
    } 
    return cipherQuery.toString(); 
} 

Beachten Sie, dass die isSQLKeyWord() und CryptoObject.encryptAndEncode() Methoden implementieren müssen.

+0

@ _venture_ Vielen Dank ..und das _ ** isSQLKeyWord() ** _ ist die benutzerdefinierte Funktion richtig? – Abhishek

+0

@Abhishek Ja. Es gibt einige Schlüsselwörter, also würde ich ein Hashset verwenden, um alle zu verfolgen. – venture

+0

Danke. Ich habe es zwar nicht benutzt, aber es sieht so aus, als würde es funktionieren. Nochmal vielen Dank. – Abhishek

0

Sie können den Code aus Alibabas Druid project verwenden. Obwohl dieses Projekt als eine ausgefeilte Pooling-Bibliothek für Verbindungen konzipiert ist, unterstützt dieses Projekt eine sehr fortgeschrittene parser and AST für ANSI SQL und Nicht-ANSI-Dialekte wie MySQL, Oracle, SQL Server usw. Das Projekt ist Open Source und trägt die sehr liberale Apache License Version 2.0.

Der Haupteingang in diesen Teil der Bibliothek ist SQLUtils.java. Sie können Werte aus SQLUtils.parseStatements zurück verwenden, um eine typisierte Modell der Aussagen zuzugreifen:

List<SQLStatement> statements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); 
for (SQLStatement statement : statements) { 
    if (statement instanceof SQLSelectStatement) { 
     SQLSelectStatement createTable = (SQLSelectStatement) statement; 
     // Use methods like: createTable.getSelect().getQuery(). 
    } 
}