ruby-on-rails – 如何在rails中混淆我的记录的id?

我试图弄清楚如何在轨道上混淆我的记录的ids.

例如:一个典型的路径可能看起来像http://domain/records/1,所以人们很容易推断网站获得的流量,如果他们只是创建一个新的记录.

我使用的一个解决方案是使用盐对id进行散列,但是由于我不知道这个函数是否是双射的,所以我最终将它存储在数据库的另一个列中,并重新检查其唯一性.

我正在考虑的另一个选择是生成随机哈希,并将其另存为另一列.如果它不是唯一的…只是生成一个.

这样做最好的方法是什么?

解决方法

您可以使用内置的OpenSSL库来加密和解密您的标识符,这样您只需要在模型上覆盖to_param即可.您还需要使用Base64将加密数据转换为纯文本.我会把它粘在一个模块中,以便可以重用:
require 'openssl'
require 'base64'

module Obfuscate
  def self.included(base)
    base.extend self
  end

  def cipher
    OpenSSL::Cipher::Cipher.new('aes-256-cbc')
  end

  def cipher_key
    'blah!'
  end

  def decrypt(value)
    c = cipher.decrypt
    c.key = Digest::SHA256.digest(cipher_key)
    c.update(Base64.decode64(value.to_s)) + c.final
  end

  def encrypt(value)
    c = cipher.encrypt
    c.key = Digest::SHA256.digest(cipher_key)
    Base64.encode64(c.update(value.to_s) + c.final)
  end
end

所以现在你的模型需要看起来像这样:

class MyModel < ActiveRecord::Base
  include Obfuscate

  def to_param
    encrypt id
  end
end

然后在您的控制器中,当您需要通过加密的ID找到记录时,您将使用以下内容

MyModel.find MyModel.decrypt(params[:id])

如果您希望加密/解密ids而不将其存储在数据库中,这可能是最简单的方法.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...