2014-03-30 18 views
2

我试图如何使用rails secure_compare?

line:60 mv = ActiveSupport::MessageVerifier.new 
     return nil unless mv.secure_compare(a, b) 

这给错误

ArgumentError - wrong number of arguments (0 for 1..2): 
activesupport (4.0.3) lib/active_support/message_verifier.rb:29:in `initialize' 
app/controllers/application_controller.rb:60:in `new' 

http://apidock.com/rails/ActiveSupport/MessageVerifier/secure_compare

编辑

积极支持方法是私人的,所以我只是直接复制的方法到应用控制器。

def secure_compare(a, b) 
    return false unless a.bytesize == b.bytesize 

    l = a.unpack "C#{a.bytesize}" 

    res = 0 
    b.each_byte { |byte| res |= byte^l.shift } 
    res == 0 
    end 

这样做或使用此实现是否存在任何公然的安全问题?

回答

0

当您调用它时,您需要将一个或两个参数传递给.new。也许这里的文档将帮助您:

http://apidock.com/rails/ActiveSupport/MessageVerifier

+0

它看起来像唯一需要的论据是秘密。我很困惑,因为'#secure_compare'本身有两个参数'(a,b)',我认为这两个参数是被比较的两个秘密。那么你是否应该将其中的一个传递给MessageVerifier.new(key)',然后使用'#secure_compare(self.key,other_key)'? – sixty4bit

3

secure_compare是因为轨道4.2.0的ActiveSupport :: SecurityUtils的公共类方法http://api.rubyonrails.org/v4.2.0/classes/ActiveSupport/SecurityUtils.html

用例:

def authenticate_by_token 
    authenticate_with_http_token do |token, options| 
    user = User.find_by(id: options[:uid]) 
    if user && ActiveSupport::SecurityUtils.secure_compare(user.auth_token, token) 
     @current_user = user 
    end 
    end 
end 
+0

这不是4.2.0中'secure_compare'的正确用法。值必须具有相同的长度(请参阅https://github.com/rails/rails/blob/e4a6dd147453aedecda7938a5650fcc2ff6febe9/activesupport/lib/active_support/security_utils.rb#L5-L20)。在原始字符串上使用的是'variable_size_secure_compare'。 – RocketR

+0

奇怪的是,在最新版本中,它们交换了方法的名称,所以现在在原始字符串上使用的是'secure_compare',另一个是'fixed_length_secure_compare'。 https://github.com/rails/rails/blob/3b4f14dc43f09addb50c546ffe23b9e03eafed20/activesupport/lib/active_support/security_utils.rb – RocketR