【问题标题】:Bind method name to mysql where clause?将方法名称绑定到mysql where子句?
【发布时间】:2016-11-18 13:07:38
【问题描述】:

我用了两张桌子。

table1: Employees table 我有两列id, employees_id(类型:Long)

table2: Salary table 我有两列 id, employees_encrpted_id(Type: String)

注意1.两个表的公共字段是Employees表中的employees_id(这里我们存储在员工id中)和Salary表中的employees_encrpted_id (我们使用加密方法加密员工id然后存储)

2.我已经解密了方法(名字是decrypt)。可以将该方法绑定到 mysql 查询。我试过这样

"select * from employees as emp,salary as s where emp.employees_id = CAST("+decrypt("s.employees_encrpted_id")+"AS UNSIGNED)"

但会抛出错误“[MySQLSyntaxErrorException:您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ')' 附近使用正确的语法]”

【问题讨论】:

  • 假设您还没有这样做,(只是)加密薪水会容易得多(可能包括 id 到密码中,以防止两个相同的薪水看起来相同)。而且它实际上要安全得多,因为通常可以从其他信息中得出结论,它可以(或不能)是哪个 id,例如如果表包含历史,第一次进入的日期对应于加入公司的日期,升职对应于加薪,进入的次数可能与在公司的工作时间有关,最高薪水可能属于老板(或 dba ), ...

标签: mysql scala encryption playframework


【解决方案1】:

如果您必须处理加密的 ID 列,您有以下选择:

1) 将引用的表加载到内存中(从您的数据库中,到您的应用程序中),然后解密,然后加入......显然这有一个小缺陷:您无法使用您的 DBMS 进行连接,或用于分组,或用于聚合等,如果所述事物依赖于加密列以解密形式可用

2) 加载第一个表,对 id 进行加密,并创建一个临时表,其中包含第一个 ID 加密的表,针对临时表 + 其他具有加密 ID 的表运行查询,然后删除临时表...显然还有一个小缺陷:您的 DBMS 获得了它不应该知道的知识:加密和未加密 id 之间的关系......

3) 将您的加密/解密实现为存储函数,并在每次使用关系时使用密钥调用它...再次存在缺陷:您的 DBMS 将需要为每个 id 值调用此函数以获得解密/加密的值,这可能会对您或您的用户造成的性能影响最多(如果有的话)几乎不能容忍

最后,您很可能会发现,由于密钥必须存储在应用程序服务器上,或者可以在 DBMS 端被截获,因此您的加密 ID 的全部安全增益将丢失,并且实现加密 ID 列的整个过程只是为了好玩而不是为了盈利

【讨论】:

    猜你喜欢
    • 2018-02-26
    • 2020-02-08
    • 2017-08-12
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2019-10-04
    相关资源
    最近更新 更多