2009-06-30 176 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)