2011-07-08 62 views
12

鑑於我有一個網站,其中大部分資源都有數字ID(即user.id question.id等),但像德國人回顧二戰時期我寧願不向觀察者透露這些信息,混淆它們的最佳方式是什麼?在應用程序中混淆數字ID的最佳方式是什麼

我相信該方法會涉及.to_param,然後一些對稱加密算法,但我不知道什麼是最有效的加密做,以及如何將在DB等

影響查找時間

任何意見來自踐踏的道路將不勝感激。

回答

8

我通常使用鹽漬散列並將其存儲在數據庫中的索引字段中。這取決於您期望的安全級別,但我使用一種鹽。

該方法使得創建過程更加昂貴,因爲您將擁有INSERTUPDATE,但您的查找速度相當快。

僞代碼:

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 

現在你可以看看了MyModel.find_by_hashed_id(params[:id])記錄沒有任何性能影響。

+0

非常有幫助,ty。你有沒有想過在PostGres中使用字符串ID而不是整數是否會帶來很多性能問題? –

+0

我不確定,但是如果你在字符串字段中加入索引,性能損失就不會很大。 – Wukerplank

12

我發佈了一個名爲obfuscate_id的Rails插件。我不需要它是安全的,但只是爲了使網址中的id對於臨時用戶不明顯。我也希望它看起來比長散列更乾淨。

它還具有無需遷移或更改數據庫的優勢。這很簡單。

只需寶石添加到您的Gemfile

gem 'obfuscate_id' 

並添加調用模型中的模糊處理ID:

class Post < ActiveRecord::Base 
    obfuscate_id 
end 

這將創建URL是這樣的:

# post 7000 
http://example.com/posts/5270192353 
# post 7001 
http://example.com/posts/7107163820 
# post 7002 
http://example.com/posts/3296163828 

你也不需要以任何特殊的方式查詢記錄,ActiveRecord find只是工作。

Post.find(params[:id]) 

點擊此處瞭解詳情:

https://github.com/namick/obfuscate_id

+0

很好,謝謝 – 32423hjh32423

+0

這很甜!但是,我有一個問題。有沒有這個寶石的任何選項通過帖子的標題,所以我可以得到像這樣的東西:http://example.com/posts/5270192353/my-page-title。如果是這樣,那很可愛! –

+0

這似乎不適用於Rails 4.0.2 - 安裝時遇到問題!它說Rails 3.2.1是必需的。 –

4

您可以嘗試使用這種寶石,

https://github.com/wbasmayor/masked_id

它混淆你的ID,並在同一時間給每一個它自己的模型混淆代碼,所以沒有。 1個ID不會有相同的散列。另外,它不覆蓋軌道上的任何東西,它只是提供了新的方法,所以它不會弄亂你的軌道,如果你也擴展它們。

6

這是一個解決方案。這與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 
3

面對類似的問題,我創建了一個gem來處理使用Blowfish的模型id的混淆。這允許在飛行中創建漂亮的11個字符混淆的ID。 注意事項是,該ID必須在99,999,999,例如, 8.

https://github.com/mguymon/obfuscate

一個最大長度要與Rails的使用,在配置創建一個初始化/初始化有:

require 'obfuscate/obfuscatable' 
Obfuscate.setup do |config| 
    config.salt = "A weak salt ..." 
end 

現在添加到你想成爲Obfuscatable型號:

class Message < ActiveRecord::Base 
    obfuscatable # a hash of config overrides can be passed. 
end 

獲取11個字符obfuscated_id,它使用Blowfish單塊加密:

message = Message.find(1) 
obfuscated = message.obfuscated_id   # "NuwhZTtHnko" 
clarified = message.clarify_id(obfuscated) # "1" 

Message.find_by_obfuscated_id(obfuscated) 

和混淆使用的Blowfish加密字符串文本塊,使文本的長塊被擾亂:

obfuscated = message.obfuscate("if you use your imagination, this is a long block of text") # "GoxjVCCuBQgaLvttm7mXNEN9U6A_xxBjM3CYWBrsWs640PVXmkuypo7S8rBHEv_z1jP3hhFqQzlI9L1s2DTQ6FYZwfop-xlA" 
clarified = message.clarify(obfuscated) # "if you use your imagination, this is a long block of text" 
+0

我喜歡你的寶石,但我無法弄清楚如何使用它在url中顯示混淆的id的方式 –

相關問題