鑑於我有一個網站,其中大部分資源都有數字ID(即user.id question.id等),但像德國人回顧二戰時期我寧願不向觀察者透露這些信息,混淆它們的最佳方式是什麼?在應用程序中混淆數字ID的最佳方式是什麼
我相信該方法會涉及.to_param,然後一些對稱加密算法,但我不知道什麼是最有效的加密做,以及如何將在DB等
影響查找時間任何意見來自踐踏的道路將不勝感激。
鑑於我有一個網站,其中大部分資源都有數字ID(即user.id question.id等),但像德國人回顧二戰時期我寧願不向觀察者透露這些信息,混淆它們的最佳方式是什麼?在應用程序中混淆數字ID的最佳方式是什麼
我相信該方法會涉及.to_param,然後一些對稱加密算法,但我不知道什麼是最有效的加密做,以及如何將在DB等
影響查找時間任何意見來自踐踏的道路將不勝感激。
我通常使用鹽漬散列並將其存儲在數據庫中的索引字段中。這取決於您期望的安全級別,但我使用一種鹽。
該方法使得創建過程更加昂貴,因爲您將擁有INSERT
和UPDATE
,但您的查找速度相當快。
僞代碼:
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])
記錄沒有任何性能影響。
我發佈了一個名爲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])
點擊此處瞭解詳情:
很好,謝謝 – 32423hjh32423
這很甜!但是,我有一個問題。有沒有這個寶石的任何選項通過帖子的標題,所以我可以得到像這樣的東西:http://example.com/posts/5270192353/my-page-title。如果是這樣,那很可愛! –
這似乎不適用於Rails 4.0.2 - 安裝時遇到問題!它說Rails 3.2.1是必需的。 –
您可以嘗試使用這種寶石,
https://github.com/wbasmayor/masked_id
它混淆你的ID,並在同一時間給每一個它自己的模型混淆代碼,所以沒有。 1個ID不會有相同的散列。另外,它不覆蓋軌道上的任何東西,它只是提供了新的方法,所以它不會弄亂你的軌道,如果你也擴展它們。
這是一個解決方案。這與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
面對類似的問題,我創建了一個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"
我喜歡你的寶石,但我無法弄清楚如何使用它在url中顯示混淆的id的方式 –
Hashids是一個偉大的跨平臺的選項。
非常有幫助,ty。你有沒有想過在PostGres中使用字符串ID而不是整數是否會帶來很多性能問題? –
我不確定,但是如果你在字符串字段中加入索引,性能損失就不會很大。 – Wukerplank