2014-02-07 215 views
-1

我已經完成了幾個不同長度和難度的教程,其中一些教程構建了一個從頭開始的自定義認證系統。大多數時候,我似乎找到了加密密碼的以下方法。Ruby on Rails用戶加密

rails generate model User name:string email:string

然後

rails generate migration add_password_digest_to_users password_digest:string

其產生的哈希密碼的開發數據庫,​​看到的,而不是密碼(密碼1)當它顯示像RFTER4dr3wxMnei代替。

是否可以通過此方法向用戶添加其他屬性?例如,如果我有兩種驗證方法(輸入用戶名和密碼),那麼(輸入令人難忘的信息)是否可以使用相同的方法對它們進行加密?

還是怎麼的,從理論上講,(如果可能的話),你可以用它來加密所有用戶的數據(他們的姓名,電子郵件,出生日期,密碼等)

回答

2

的這不是加密,它是晶體散佈。散列函數是爲每個輸入生成一個唯一的輸出的函數,從這個函數不可能的(理論上)重建輸入(短缺蠻力攻擊或類似哈希表的東西)。

散列函數非常適用於身份驗證,因爲這意味着您實際上並不存儲密碼的。您只能存儲一些可以確認密碼正確性的內容。每次有人登錄時,都會使用相同的算法對給定的密碼進行散列,並對散列進行比較。這樣,如果有人闖入數據庫,他們實際上無法獲得密碼。

您實際需要訪問的信息,不只是驗證(您需要驗證密碼,但訪問DoB,用戶名等)可以是已加密,但您需要弄清楚您如何處理密鑰等等,因爲如果有人能夠從密鑰的相同位置竊取加密信息,那實際上是毫無意義的。

值得一提的是:雖然它對於學習非常有用,但除非您也有自己的認證系統,否則不要在生產環境中實施自己的認證系統。或者使用一些經過安全專家審查的開源代碼,或者使用可靠且安全的第三方身份驗證(通過Google,OpenID,Oauth,使用Facebook登錄等)

+0

謝謝你的回答方式很有用。通過「你如何處理鍵」我不是100%確定你的意思?我想我可能會給出一個解釋。我正在使用鍵值對,並且在我的數據庫中有兩個散列變量,**密碼摘要**和**記憶令牌**,下面是一個示例,其中是數據庫中示例用戶的密碼摘要和記憶標記。摘要:** $ 2a $ 10 $ ZUg8kc8KEELrRZnEtXQLZewVlkGZ9p1LguRvAYrX.iLRJXL8aKCY **和令牌** PwcKkFsI3xJVevx-iDzWPg **這與您所說的相似嗎? – Aluxzi

+0

@Aluxzi:不,我在談論加密密鑰。這是一個很大的概念,你可能應該比谷歌更好的解釋。 – Linuxios