2009-06-30 88 views
1

我必須解析下面的「一些文本< 40字節哈希>」我可以在不損壞40字節哈希部分的情況下將這整個東西讀入一個字符串嗎?SHA-1哈希與字符串混合

事情是哈希不會在那裏,所以我不想在閱讀時處理它。

編輯:我忘了提及40字節散列是2x20字節散列沒有編碼原始字節。

+0

什麼你最終與嗎? – codethulhu 2009-07-20 17:12:15

回答

0

SHA-1散列長度爲20個字節(160位)。如果處理40個字符的散列,那麼它們可能是散列的ASCII表示,因此只包含字符0-9和a-f。如果是這種情況,那麼你應該能夠毫無困難地閱讀和操縱Java中的字符串。

+0

編輯提到40字節散列是2,20字節sha-1散列沒有編碼。 – 2009-06-30 00:43:25

0

一些更多的細節可能是有用的,但我認爲答案是你應該沒問題。

您沒有說過SHA-1散列是如何編碼的(常見的可能性包括「none」(原始字節),Base64和十六進制)。由於SHA-1產生一個20字節(160位)散列,我猜測它將使用十六進制編碼,因爲這會使你提到的40個字節所需的空間增加一倍。使用該編碼,將使用2個字符對散列中的每個字節進行編碼,使用符號0到9和A到F.這些都是ASCII字符,因此您很安全。

由於Base64中使用的每個字符都是ASCII,因此Base64編碼也可以工作(雖然可能不是您詢問的問題,因爲它將字號增加了大約1/3,使得您的字節數少於40字節)。

如果直接使用原始字節,則會出現問題,因爲某些值不是有效的字符。

0

OK,現在你已經澄清,這些都是原始字節

不,你不能讀成Java這是一個字符串,你需要將它讀成原始字節。

0

工作代碼: 將字節串輸入轉換爲十六進制字符,在幾乎所有字符串編碼中都應該是安全的。使用我在其他問題中發佈的代碼將十六進制字符解碼回原始字節。

/** Lookup table: character for a half-byte */ 
    static final char[] CHAR_FOR_BYTE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
    /** Encode byte data as a hex string... hex chars are UPPERCASE */ 
    public static String encode(byte[] data){ 
     if(data == null || data.length==0){ 
      return null; 
     } 
     char[] store = new char[data.length*2]; 
     for(int i=0; i<data.length; i++){ 
      final int val = (data[i]&0xFF); 
      final int charLoc=i<<1; 
      store[charLoc]=CHAR_FOR_BYTE[val>>>4]; 
      store[charLoc+1]=CHAR_FOR_BYTE[val&0x0F]; 
     } 
     return new String(store); 
    } 
1

從輸入流作爲一個字節流中讀取它,然後剝離串出流是這樣的:

String s = new String(Arrays.copyOfRange(bytes, 0, bytes.length-40)); 

然後讓你的字節數爲:

byte[] hash = Arrays.copyOfRange(bytes, s.length-1, bytes.length-1)