2012-08-09 51 views
0

需要我們的用戶每月完成並提交一次表單。所以,每個月我們應該有一個包含三元組數據(用戶名,月份,年份)的表單。我希望我們的用戶能夠通過爲他們創建收據來證明他們確實提交了該月的表格。因此,每個月都會有一份報告,其中包含用戶隨收據一起提交的數據。我不希望用戶能夠自己創建收據。爲用戶表單提交創建收據

我在想什麼是創建一個包含usernamemonthyearsecret_word一個字符串,並給該字符串的MD5哈希給用戶作爲他們的收據。這種方式是因爲用戶不會擁有祕密詞,他們將無法生成md5哈希。然而,當我們的用戶看到md5散列的複雜性時,他們可能會抱怨。此外,如果找出祕密詞,他們將能夠爲每個人創建收據。

有沒有一個標準的方法來做我想問的問題?你能推薦我任何其他可能的解決方案嗎?

我正在使用Python,但一些僞代碼或鏈接到適當的方法將沒問題。

回答

1

@Serafeim,你的方法是非常好的情況。下面是擴展它的一些想法:

  1. 確保secret_word(在哈希方面它被稱爲)是足夠長的時間。
  2. 使最終功能更復雜一點,

    hash = h(h(username) + month + year + h(salt))

  3. 使用稍微複雜的散列函數,例如SHA1
  4. 不要給最終用戶整個散列值。例如。 md5十六進制摘要包含32位數字,但在報告中有足夠的前5位數字。

更新時間:

如果你有資源,生成每個用戶隨機鹽。然後,即使用戶不知何故學習了鹽和哈希函數,對於其他用戶也是無用的。

+0

我也可以將十六進制數字轉換爲10位數字,以便僅向用戶顯示0-9位數字,並向用戶顯示(例如)12位數字...... – Serafeim 2012-08-09 10:31:41

+0

絕對如此。這看起來更不像是一個十六進制摘要的一部分。 – 2012-08-09 10:36:25