2010-02-19 45 views
5

假設你想使託管網站供人上傳自己的文件,並把鏈接發給自己的朋友再取回文件,要確保文件被複制我們存儲他們,是PHP的sha1_file好足夠的任務?是否有任何理由不使用md5_file?SHA是否足以檢查文件重複? (在PHP sha1_file)

針對前端,它會使用原來的文件名存儲在數據庫中,但一些額外的擔憂是,如果這將揭示原始的海報東西被遮蔽。文件是否像最後一次修改那樣繼承了任何元信息?是誰發佈的,還是基於文件系統的東西?

而且,使用輕薄,因爲彩虹表攻擊的安全性方面毫無意義這和散列以後可作爲校驗和鹽?

最後一件事,可擴展性?最初,它只能用於幾個大的小文件,但最終...

編輯1:散列點主要是爲了避免文件重複,而不是創造朦朧。

回答

0

兩者都應該沒問題。 sha1是比md5更安全的哈希函數,這也意味着它更慢,這可能意味着你應該使用md5 :)。如果文件非常小,您仍然希望使用salt來防止明文/彩虹攻擊(不要假定人們決定上傳到您的網站)。性能差異可以忽略不計。只要你知道鹽,你仍然可以用它作爲校驗和。

對於可擴展性,我猜你可能會成爲IO的限制,而不是CPU綁定的,所以我不認爲計算校驗會給你很大的開銷,ESP。如果您在流上傳文件時執行此操作。

+0

不 - 雖然sha1算法更復雜/具有更高的順序,但PHP中的實際實現會創建sha1哈希比md5稍快(至少是上次檢查PHP 5.1或其他) – symcbean 2010-02-19 13:06:14

+0

@symcbean you're大概是正確的,我不知道PHP的具體細節。 – ykaganovich 2010-02-19 17:53:03

1

SHA應該在任何「正常」環境中都能正常工作。雖然這就是「Git Magic」的作者Ben Lynn所說的:

A.1。 SHA1弱點 隨着時間的推移,密碼學家發現越來越多的弱點。對於資金充足的組織來說,發現散列 衝突是可行的。在 年之內,也許即使是典型的PC也會有 足夠的計算能力來悄悄地破壞Git倉庫。 希望在進一步研究破壞SHA1之前,Git將遷移到更好的散列函數。

您可以隨時檢查SHA256或更長的其他人。發現MD5碰撞比使用SHA1更容易。

2

按我的評論@ ykaganovich的回答,SHA1是(奇怪)略快於MD5。

從您的問題描述,你是不是要建立一個安全散列 - 只是隱藏在一個大的命名空間中的文件 - 在這種情況下使用鹽/彩虹表的都無關緊要 - 唯一的考慮是的可能性錯誤的碰撞(2個不同的文件給出相同的散列)。 md5發生這種情況的可能性非常非常小。它與sha1更加遙遠。但是,您需要考慮兩位獨立用戶將相同的warez上傳到您的網站時會發生什麼情況。誰擁有該文件?

事實上,似乎沒有任何理由在所有使用哈希 - 只是產生一個足夠長的隨機值。

+0

我認爲校驗和的附加好處保證散列? – wag2639 2010-02-19 15:07:56

+0

+1好點,只是做一個隨機值:)如果你想要一個校驗和,使用CRC,但不清楚爲什麼需要校驗和。 – ykaganovich 2010-02-19 17:53:54

+0

我想避免重複的文件。我將有一個sql表來將所有者與文件關聯起來。 – wag2639 2010-02-20 19:23:37

1

sha1_file夠好嗎?

使用sha1_file已經足夠了,碰撞的機率很小,但幾乎不會發生。爲了減少機率幾乎爲0比較文件大小太:

function is_duplicate_file($file1, $file2) 
{ 
    if(filesize($file1) !== filesize($file2)) return false; 

    if(sha1_file($file1) == sha1_file($file2)) return true; 

    return false; 
} 

MD5比SHA1快,但它產生唯一的輸出少,碰撞的機會使用MD5時仍然是非常小的思想。

可伸縮性?

有幾種方法可以比較文件,使用哪種方法取決於你的表現的擔憂是什麼,我做了不同的方法小試:

1-直接文件比較:

if(file_get_contents($file1) != file_get_contents($file2)) 

2- Sha1_file

if(sha1_file($file1) != sha1_file($file2)) 

3- md5_file

if(md5_file($file1) != md5_file($file2)) 

結果: 2文件1.2MB每個進行比較的100倍,我得到了以下結果:

-------------------------------------------------------- 
method     time(s)   peak memory 
-------------------------------------------------------- 
file_get_contents   0.5    2,721,576 
sha1_file     1.86    142,960 
mdf5_file     1.6    142,848 

的file_get_contents是最快的3.7比SHA1快,但它不是有效的內存。

Sha1_file和md5_file具有內存高效性,它們使用了file_get_contents使用的大約5%的內存。

md5_file可能是一個更好的選擇,因爲它比sha1快一點。

所以結論是,它取決於,如果你想要更快的比較,或更少的內存使用。