2012-11-27 48 views
1

我正在嘗試構建一個測試,該測試將允許我執行FilePicker.io安全性。該代碼運行如下:使用Ruby測試filepicker.io安全性

ruby test.rb [file handle] 

並且結果是我可以附加到FilePicker URL的查詢字符串。我很確定我的政策正在被正確閱讀,但我的簽名不是。有人能告訴我我做錯了什麼嗎?下面的代碼:

require 'rubygems' 
require 'base64' 
require 'cgi' 
require 'openssl' 
require 'json' 

handle = ARGV[0] 
expiry = Time::now.to_i + 3600 
policy = {:handle=>handle, :expiry=>expiry, :call=>["pick","read", "stat"]}.to_json 
puts policy 
puts "\n" 
secret = 'SECRET' 
encoded_policy = CGI.escape(Base64.encode64(policy)) 
signature = OpenSSL::HMAC.hexdigest('sha256', secret, encoded_policy) 
puts "?signature=#{signature}&policy=#{encoded_policy}" 

回答

4

的技巧是使用,而不是CGI.escape Base64.urlsafe_encode64:

require 'rubygems' 
require 'base64' 
require 'cgi' 
require 'openssl' 
require 'json' 

handle = ARGV[0] 
expiry = Time::now.to_i + 3600 
policy = {:handle=>handle, :expiry=>expiry}.to_json 
puts policy 
puts "\n" 
secret = 'SECRET' 
encoded_policy = Base64.urlsafe_encode64(policy) 
signature = OpenSSL::HMAC.hexdigest('sha256', secret, encoded_policy) 
puts "?signature=#{signature}&policy=#{encoded_policy}" 

當與到期的樣本值測試,處理和祕密在Filepicker.io docs會返回與python示例相同的值。

+0

對不起,我沒有說清楚我目前在Ruby 1.8中,所以我沒有訪問該方法的權限。我通過刪除CGI.escape和gsubbing出新行來解決了這個問題。我不確定嚴格來說這是否正確,但它確實有效。 – brokenbeatnik

0

我在Ruby 1.8中的環境解決了這個通過移除CGI.escape和gsubbing了新行:

Base64.encode64(policy).gsub("\n","") 

elevenarms的回答是最好的Ruby 1.9的用戶,但你必須做的東西有點缺憾就像上面的Ruby 1.8一樣。儘管如此,我仍然會接受他的回答,因爲我們大多數人或很快就會在1.9以內。