通过使用MYSQL的内部加密功能,使用完全搜索功能可以做到这一点。
这是一个例子:
!!! 我在这里使用MYSQL ENCODE()为简单起见,现在认为MYSQL_ENCODE是不安全的,请使用其他内部MYSQL功能之一来代替!!!
UPDATE my_table
SET field=ENCODE('my_data', 'my_password')
WHERE ID=1;
SELECT DECODE(field, 'my_password') as field FROM my_table
WHERE field LIKE 'data';
如上面的注释所建议,请勿使用ENCODE(),而应使用其他加密功能之一由于其简单性,本例中仅使用ENCODE
如果在php之类的应用程序中执行此操作,则可以在数据库网关或存储库类中执行此操作,方法是将每个表的加密列的列表/数组存储在其各自的网关类中。
class UserGateway
{
protected $encrypted_fields = array(
'username',
'email'
);
public function get($fields, ...)
{
foreach ($fields as $k => $field) {
if (in_array($field, $fields)) {
$fields[$k] = $this->decodeSelect($field);
}
}
$sql = 'SELECT '.implode(',', $fields);
//......
}
protected function decodeSelect($field)
{
return "DECODE($field, $pass) AS $field";
}
}
当然,这是非常粗糙和不安全的代码,未经重大改进就不能在生产中使用。但是它应该在提供总体思路上发挥其作用。