2010-02-08 101 views
2

在原始jBCrypt v0.1 C#端口中查找錯誤後:BCrypt.netRelated Question)。我決定將新的jBCrypt代碼與舊的C#端口進行比較,以查找差異和潛在問題,例如相關問題的錯誤。jBCrypt 0.3 C#端口(BCrypt.net)

這裏是我發現:

// original java (jBCrypt v0.3): 
private static int streamtoword(byte data[], int offp[]) { 
     int i; 
     int word = 0; 
     int off = offp[0]; 

     for (i = 0; i < 4; i++) { 
      word = (word << 8) | (data[off] & 0xff); 
      off = (off + 1) % data.length; 
     } 

     offp[0] = off; 
     return word; 
} 


// port to C# : 
private static uint StreamToWord(byte[] data, ref int offset) 
{ 

    uint word = 0; 

    for (int i = 0; i < 4; i++) 
    { 
     // note the difference with the omission of "& 0xff" 
     word = (word << 8) | data[offset]; 
     offset = (offset + 1) % data.Length; 
    } 

    return word; 
} 

如果事先不正確,將下面的解決?

private static uint StreamToWord(byte[] data, ref int[] offsetp) 
{ 

    uint word = 0; 
    int offset = offsetp[0]; 
    for (int i = 0; i < 4; i++) 
    { 
     word = (word << 8) | (uint)(data[offset] & 0xff); 
     offset = (offset + 1) % data.Length; 
    } 

    offsetp[0] = offset; 

    return word; 
} 
+1

順便說一下,在jBCrypt中也存在「31日誌整數溢出」錯誤(感謝你的帖子,我用jBCrypt的維護人員提交了一個錯誤報告)。所以,在兩者之間做一個比較就不會發現這個問題。 :-) – 2010-02-08 16:51:34

回答

5

在Java版本中需要& 0xff,因爲在Java中,字節是有符號的。 (有人認爲這是一個bug。)

在C#中,bytes are unsigned,所以& 0xff是不必要的。

+0

謝謝。 :o)你不會碰巧知道什麼更新來解決這個安全問題(http://www.mindrot.org/files/jBCrypt/internat.adv),你會嗎?我想升起C#移植版本。 – 2010-02-08 17:00:44

+1

是的,它已修復爲使用UTF-8而不是US-ASCII將密碼中的字符轉換爲字節。在Java中,如果一個字符不能被編碼,它將被替換爲?,而不是拋出異常。 – 2010-02-08 17:08:23

+0

@David:謝天謝地,BCrypt.NET已經在那個部門做了正確的事情,所以你不用擔心。 :-D – 2010-02-08 17:13:40