2014-03-30 17 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