SHA-1哈希与字符串混合

时间:2009-06-30 00:03:26

标签: java hash byte sha

我必须解析类似下面的内容“some text< 40 byte hash>”我可以把这整篇文章读成一个字符串而不会破坏40字节的哈希部分吗?

事情是哈希不会存在,所以我不想在阅读时处理它。

编辑:我忘了提到40字节散列是2x20字节散列没有编码原始字节。

5 个答案:

答案 0 :(得分:1)

从输入流中将其作为字节流读取,然后将String从流中剥离出来,如下所示:

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

然后得到你的字节:

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

答案 1 :(得分:0)

SHA-1哈希长度为20个字节(160位)。如果处理40个字符哈希,那么它们可能是哈希的ASCII表示,因此只包含字符0-9和a-f。如果是这种情况,那么您应该能够毫无困难地在Java中读取和操作字符串。

答案 2 :(得分:0)

更多细节可能有用,但我认为答案是你应该没事。

您没有说明SHA-1哈希是如何编码的(常见的可能性包括“无”(原始字节),Base64和十六进制)。由于SHA-1产生一个20字节(160位)的散列,我猜它将使用十六进制编码,因为这会使你提到的40字节所需的空间翻倍。使用该编码,将使用2个字符对散列中的每个字节进行编码,使用符号0到9和A到F.这些都是ASCII字符,因此您是安全的。

Base64编码也可以工作(虽然可能不是你提出的问题,因为它增加了大约1/3而使你的数据少于40个字节),因为Base64中使用的每个字符也都是ASCII。

如果直接使用原始字节,则会出现问题,因为某些值不是有效字符。

答案 3 :(得分:0)

好的,现在您已经澄清这些是原始字节

不,你不能把它作为字符串读到Java中,你需要把它作为原始字节读取。

答案 4 :(得分: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);
    }