Java中的CRC32哈希算法

4
我正在尝试在Java中创建字符串的CRC32哈希值。我已经使用java.util.zip.CRC32成功实现了此操作。但我的要求是使用秘密密钥创建字符串的CRC32哈希值。有谁能告诉我如何做到这一点吗?提前感谢您...
下面是我现有的代码...
String a = "abcdefgh";
CRC32 crc = new CRC32();
crc.update(a.getBytes());

String enc = Long.toHexString(crc.getValue());
System.out.println(enc);

你的意思是使用盐吗? - Denys Séguret
是的...我需要使用盐.. - akh
1
为什么CRC32不适合用于密码学? - Denys Séguret
3个回答

2
你可以这样做:

public static String getCRC32(byte[] data){
        CRC32 fileCRC32 = new CRC32();
        fileCRC32.update(data);
        return String.format(Locale.US,"%08X", fileCRC32.getValue());
    }

2

我想你需要在更新crc32类之前将这个键添加到你的字符串中,这是一种方法,希望这是你要找的。

import java.nio.ByteBuffer;
import java.security.SecureRandom;
import java.util.zip.CRC32;

public class example {

public void main(){

    ///this is user supplied string
    String a = "ABCDEFGHI";
    int mySaltSizeInBytes = 32;
    //SecureRandom class provides strong random numbers
    SecureRandom random = new SecureRandom();

    //salt mitigates dictionary/rainbow attacks
    byte salt[] = new byte[mySaltSizeInBytes];

    //random fill salt buffer with random bytes
    random.nextBytes(salt);

    //concatenates string a  and salt
    //into one big bytebuffer ready to be digested
    //this is just one way to do it
    //there might be better ways

    ByteBuffer bbuffer = ByteBuffer.allocate(mySaltSizeInBytes+a.length());
    bbuffer.put(salt);
    bbuffer.put(a.getBytes());

    //your crc class
    CRC32 crc = new CRC32();
    crc.update(bbuffer.array());
    String enc = Long.toHexString(crc.getValue());
    System.out.println(enc);

    }
}

0

使用盐可以确保散列字符串与另一个盐或无盐的散列不同。

通常使用简单的连接方式:

String a = "your string you want to hash" + "the salt";

但这里有点令人惊讶:加盐通常是为了安全性,而CRC32通常不用于密码学,它是一种非安全哈希,用于冗余检查或索引键。


谢谢你的回答...实际上这就能满足我的需求 :) - akh
永远不要在字符串的末尾放置盐,至少对于像CRC32这样不安全的哈希算法是如此。盐应该总是放在字符串的开头。请看这里 - Jonathan Hall
@Flimzy 正如我在评论中所说,CRC32不适用于密码学。当目的是密码学时,您应使用正确的哈希算法,而盐是否在末尾并不重要。 - Denys Séguret
哈希算法(单独使用)在密码学中从未是恰当的选择。但有时候,哈希算法已经足够,安全性仍然是必要的。 - Jonathan Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接