在应用程序中混淆数字ID的最佳方法是什么

Pet*_*xey 13 ruby-on-rails

鉴于我有一个网站,其中大部分资源都有数字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

  • 虽然我赞赏Nathan的努力,并且明白不是每个人都有时间来维护他们创建的图书馆,但我鼓励任何读这篇文章的人都要对他们说一句教训,从长远来看,通常是一个更好的想法.代码,以便您不会争先恐后地替换升级核心框架时未维护的依赖项. (2认同)

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])没有任何性能影响的情况下查找记录.


tyb*_*103 7

这是一个解决方案.它与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)


use*_*584 5

Hashids是很好的跨平台选择。