ruby-on-rails - 如何在 attr_encrypted 数据库字段上添加索引?

标签 ruby-on-rails database performance postgresql indexing

我有

attr_accessible :access_token
attr_encrypted :access_token, key: ENV['ENCRYPTION_KEY']

我正在做一些User.find_by_access_token,所以我想在数据库中索引该字段。

但是,不存在 access_token,只有 encrypted_access_token

索引此字段与索引任何其他字段的作用相同吗?

最佳答案

保存加密数据的全部目的是防止显示明文。显然你无法搜索它,否则整个概念就会有缺陷。

您可以使用普通索引来索引加密 token ,并使用加密 token 搜索表 - 显然您需要加密 key 。

CREATE INDEX tbl_encrypted_access_token_idx ON tbl(encrypted_access_token);

SELECT *
FROM   tbl
WHERE  encrypted_access_token = <encrypted_token>;

如果您的所有 token 都可以使用 IMMUTABLE Postgres 函数解密,您可以使用 index on an expression :

CREATE INDEX tbl_decrypted_token_idx
ON tbl(decrypt_func(encrypted_access_token));

SELECT *
FROM   tbl
WHERE  decrypt_func(encrypted_access_token) = <access_token>;

请注意,表达式必须与索引中的表达式匹配才能使索引有用。

但这会造成多层面的安全隐患

关于ruby-on-rails - 如何在 attr_encrypted 数据库字段上添加索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874823/

相关文章:

ruby-on-rails - 使用 Ruby 在 S3 中重命名对象

ruby-on-rails - 判断字符串是否只包含数字

html - 用空格替换 html 标签

database - 如何克服 Netezza 缺乏唯一约束/参照完整性实现的问题?

android - 如何将数据库包含在移动设备本身中以供离线Android应用程序使用?

c - 函数的执行时间

ruby-on-rails - 在Rails Controller 中使用清理

php - 当他们使用电子邮件登录时从表中获取用户名

mysql - 为什么重新启动 MySQL 会使我的站点更快?

java - 这个 JMH 基准在机器之间不一致 - 为什么?