鉴于我有一个网站,其中大部分资源都有数字ID(即user.id question.id等),但就像德国人回顾二战时我宁愿不向观察者透露这些,最好的方法是什么混淆他们?
我认为该方法将涉及.to_param,然后是一些对称加密算法,但我不确定什么是最有效的加密,以及它将如何影响数据库中的查找时间等.
我们非常感谢道路上的任何建议.
小智 12
我发布了一个名为obfuscate_id的Rails插件.我不需要它是安全的,但只是为了让网址中的id对于临时用户来说不明显.我还希望它看起来比长哈希更干净.
它还具有不需要迁移或数据库更改的优点.这很简单.
只需将宝石添加到您的Gemfile
:
gem 'obfuscate_id'
Run Code Online (Sandbox Code Playgroud)
并在模型中添加调用obfuscate id:
class Post < ActiveRecord::Base
obfuscate_id
end
Run Code Online (Sandbox Code Playgroud)
这将创建这样的网址:
# post 7000
http://example.com/posts/5270192353
# post 7001
http://example.com/posts/7107163820
# post 7002
http://example.com/posts/3296163828
Run Code Online (Sandbox Code Playgroud)
您也不需要以任何特殊方式查找记录,ActiveRecord find
就可以正常工作.
Post.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
更多信息:
https://github.com/namick/obfuscate_id
Wuk*_*ank 11
我通常使用盐渍哈希并将其存储在索引字段中的数据库中.这取决于您期望的安全级别,但我使用一个盐.
这种方法使创建成本更高,因为你将拥有一个INSERT
和一个UPDATE
,但你的查找将非常快.
伪代码:
class MyModel << ActiveRecord::Base
MY_SALT = 'some secret string'
after_create :generate_hashed_id
def to_param
self.hashed_id
end
def generate_hashed_id
self.update_attributes(:hashed_id => Digest::SHA1.hexdigest("--#{MY_SALT}--#{self.id}--"))
end
end
Run Code Online (Sandbox Code Playgroud)
现在,您可以在MyModel.find_by_hashed_id(params[:id])
没有任何性能影响的情况下查找记录.
这是一个解决方案.它与Wukerplank的答案是相同的概念,但有一些重要的区别.
1)无需插入记录然后更新它.只需在插入之前使用before_create
回调设置uuid .另请注意,set_uuid
回调是私有的.
2)有一个方便的库叫SecureRandom
.用它!我喜欢使用uuid,但SecureRandom也可以生成其他类型的随机数.
3)找到记录使用User.find_by_uuid!(params[:id])
.注意"!".如果找不到记录就会引发错误User.find(params[:id])
.
class User
before_create :set_uuid
def to_param
uuid
end
private
def set_uuid
self.uuid = SecureRandom.uuid
end
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5302 次 |
最近记录: |