2011-07-19 44 views
0

我有以下問題的密碼。我爲我的網站做了一個註冊密碼,這樣 需要知道這個密碼,用戶可以註冊。另外我想要一個鏈接到它的布爾值,這將決定用戶使用此密碼獲得什麼樣的權限。創建一個額外的booleanField

class RegistrationPassword(models.Model): 
    password = models.CharField(max_length=20, unique=True) 
    poweruser = models.BooleanField(default=False) 

    def __unicode__(self): 
     return self.password 

我註冊這個具有管理員這樣我就可以添加和刪除密碼,並鏈接到這些高級用戶無論是真的還是假的。然後當用戶註冊時,我檢查這樣的布爾值:

registrationpassword = form.cleaned_data.get('registrationpassword') 
ispoweruser = RegistrationPassword.objects.get(password=registrationpassword).poweruser 

問題是密碼沒有以任何方式進行散列或加密。我如何着手爲我的方法添加更多安全性?

回答

0

使用auth應用程序,user.is_superuser。不要重新發明輪子。

+0

是的,但我怎麼能說兩個不同的註冊密碼。其中一個使user.is_super = TRUE,另一個user_is_superuser = FALSE。問題不在於權限分配,而在於我可以使用兩個不同的密碼將它們分配到特定的組中。 – leffe

0

問題是密碼不散列或以任何方式進行加密。我如何着手爲我的方法添加更多安全性?

最常用的密碼是使用SHA-x或MD-5散列算法進行散列處理的。在這種情況下,開發人員散列密碼並將散列副本存儲在數據庫或代碼中。所以在任何地方都沒有人可讀的拷貝。

要反對這個密碼,您必須創建用戶輸入密碼的哈希身份驗證,然後進行比較與存儲的密碼。

如果要創建一個Web應用程序中的散列可以通過javascript提交網頁之前完成,這樣一個哈希密碼通過網絡傳輸,使其難以被黑客截獲,然後選擇「取消哈希」他們

的Javascript哈希雲像以下(假設我們使用MD5和用戶密碼爲「測試」)

  1. 產生的「測試」,這是098f6bcd4621d373cade4e832627b4f6 MD 5,並將其存儲在數據庫
  2. 在客戶端(javascript)檢索會話ID
  3. 比方說,用戶進入「測試」 MD5它首先所以結果是098f6bcd4621d373cade4e832627b4f6
  4. MD5再次與前置會話ID(假設這裏的會話ID是9985),因此新的MD5是 f93437292fca0cf9b71bf1f3fe6c4679
  5. 發送ONLY哈希服務器
  6. 服務器可以在Java中使用一個的庫的方法之一,例如可以得到由session.getId的ID()獲取會話ID;
  7. 運行查詢,其類似於以下

    選擇的MD5(CONCAT(PWD, '9985')),如從用戶NEWPWD其中UNAME = 'XYZ'

  8. 匹配 「NEWPWD」 與用戶提交的值

如果有人試圖通過HTTP回覆發佈數據,則驗證將不會通過,因爲服務器每次都會創建新的會話ID。 因此,如果用戶註銷並重新登錄一個新的散列密碼通過電線發送。

請參閱您參考以下鏈接

Python's safest method to store and retrieve passwords from a database

What is the format in which Django passwords are stored in the database?

http://en.wikipedia.org/wiki/Salt_(cryptography)

+0

在JavaScript中散列非常「安全」。 – DrTyrsa

+0

你說得對,我們可能會公開我們使用什麼算法來進行散列。但是我曾經在一些地方看到過這個網站使用javascript哈希算法,會話ID附加爲salt。因爲salt本身就是session-id,所以甚至不能在這些網站上進行重播攻擊。 – Sap

+0

因此,如果一個「黑客」嗅探交通,他會知道哈希,鹽和algorythm。非常非常棒。我也聽說過[這個東西](http://en.wikipedia.org/wiki/HTTP_Secure),但JS解決方案似乎對我更可靠,是的。 – DrTyrsa

1

此外,我想鏈接到它的一個布爾值,這將決定什麼樣的權利用戶獲得此密碼

不要。使用組。這就是他們的目的。

如果此「超級用戶」不是超級用戶,那麼您需要定義一個具有其額外特權並將超級用戶放入此組的用戶組。

您的每個視圖函數都需要確認用戶在合適的組中才能使用視圖函數。

現在ispoweruser是對組名稱的簡單測試,沒有額外的密碼沒有額外的布爾值。

+0

值得一讀:Django docs on [groups](https: //docs.djangoproject.com/en/dev/topics/auth/#groups)和[自定義權限](https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions)。 –