2012-02-24 48 views
3

我正在尋找javascript的crypt(3)的實現。 (不是通用的「crypt」算法,而是在/etc/shadow例如在Linux系統中使用的crypt(3))。有人見過嗎?憑藉開放許可證?有人在Javascript中看到過crypt(3)實現嗎?

我有點擔心的表現太:難道甚至可以寫一個在JavaScript?例如。該sha512-crypt source有:

/* Repeatedly run the collected hash value through SHA512 to burn 
    CPU cycles. */ 
for (cnt = 0; cnt < rounds; ++cnt) 
{ ... } 

所以,如果該算法在C「燒CPU週期」,會是什麼在JavaScript做什麼?炒? (例如IE6?Yikes!)我不是在javascript中編寫蠻力攻擊util,只是一次在藍色月亮中的一次crypt調用,所以也許它會好起來的。

背景:我們希望從用戶提供的/etc/password//etc/shadow文件中導入我們的webapp用戶。由於我們對用戶密碼的唯一信息是crypt(3)輸出格式,因此,爲了避免以明文形式發回用戶密碼,就我所知,我們需要一個客戶端(javascript )crypt(3)的實現,所以當web服務器提供一個salt時,客戶端發回crypt(3)輸出(爲了安全性適當散列)。

使用crypt(3)客戶端的任何替代方法都允許我們在服務器端對/etc/password//etc/shadow進行安全身份驗證,並且不需要https://也將被視爲有效答案。

回答

1

Javascript cryptography isn't secure。你必須使用SSL該鏈接有很多很好的理由,所以我會後只是一個在這裏:

如果你不信任的網絡提供一個密碼,或者更糟的是,不要」 t信任服務器不保留用戶機密,你不能相信他們提供安全碼。在你引入密碼之前,嗅探密碼或閱讀日記的同一個攻擊者只是在你做完之後劫持加密代碼。

如果你通過SSL發送你的Javascript加密,你不再需要Javascript加密;你有「真正的」密碼學。

此外,由於你只發送密碼的哈希值,並將其與你有一個哈希值,這是微不足道的攻擊者複製哈希,並使用它時,他們想要的。這被稱爲replay attack,它特別隱蔽,因爲你不能說出任何錯誤正在發生。

正因爲如此,你必須使用SSL。讓用戶通過SSL連接發送密碼,然後在服務器上執行crypt(3)。根據您所使用的web框架,你可以使用一個預先存在的模塊(如Django的PAM backend,這並不完全做你想要的不過是一個良好的開端參考)或推出自己的實現。

+0

我意識到,如果一個攻擊者可以進行中間人攻擊,他就可以以明文形式訪問用戶的密碼。期。但我不同意這一點很容易受到使用[nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)的簡單重播攻擊。如果Web服務器發送'(nonce,crypt_salt)',並且客戶端發送'sha512(concat(nonce,crypt(password,salt)))''。 https://然後只需以明文形式發送密碼即可使用,但明確排除在我的問題之外(唉,) – 2012-02-24 11:08:06