2016-11-18 32 views
0

我用了兩張表。將方法名綁定到mysql where子句?

表1:Employees表我有兩列ID,employees_id(類型:Long)

表2:Salary表我有兩列ID,employees_encrpted_id(類型:String)

注意事項1.兩張表的公用字段是Employees表(在這裏,我們存儲在員工ID)employees_idSalary表employees_encrpted_id(我們使用的加密方法來加密員工ID,然後在存儲它),

2.我已經解密的方法(名稱爲decrypt )。可以將該方法綁定到mysql查詢。我想這樣的

SELECT * FROM員工EMP,工資爲S其中emp.employees_id = CAST(」 + decrypt( 「s.employees_encrpted_id」)+ 「爲無符號)

但拋出錯誤「[MySQLSyntaxErrorException:您的SQL語法有錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以在第1行''''處使用')']'

+0

假設你已經不這樣做了,那麼(僅)加密工資(可能將密碼包括在密碼中,以防止兩個相同的工資看起來相同)。而且它實際上更安全,因爲通常可以從其它信息得出它能夠(或不能)成爲什麼樣的信息的結論,例如,如果表中包含歷史記錄,則第一條記錄的日期對應於加入公司的日期,促銷對應於加薪,條目數量可能與公司的職業時間相關,最高的薪水可能屬於老闆(或dba ),... – Solarflare

回答

0

如果您必須處理加密的ID列,你有這些選項:

1)加載表這些數據被引用到內存中(從您的數據庫中引用到您的應用程序中),然後解密,然後加入......顯然這存在一點缺陷:您無法將DBMS用於連接,分組或集合等等,如果所說的東西依賴於加密列以解密形式可用

2)加載第一個表,加密ids,並創建一個臨時表,其中包含第一個表,其ID已加密,運行您的查詢臨時表+帶有加密ID的其他表,並且刪除臨時表...顯然再次存在一點缺陷:您的DBMS獲得關於它不應該知道的知識:加密和未加密ID之間的關係...

3)將你的加密/解密作爲存儲函數實現,c所有它每次使用關係時都帶一個鍵......再次存在一個缺陷:您的DBMS需要爲每個id值調用此函數以獲取解密/加密的值,這可能會影響您或您的用戶的性能如果可以的話,最多隻能容忍

最終,您很可能會發現由於密鑰必須存儲在應用程序服務器上,因此您的加密ID的整個安全增益將會丟失,或者可以在數據庫管理系統端攔截,而實施加密ID列的整個處理僅僅是爲了好玩而不是爲了獲利