从字符串生成密钥?

Jon*_*ory 10 java cryptography key

我需要从字符串生成一个Key,这样我总是可以从同一个字符串创建相同的键.(特别是一个Key对象,这样我就可以用它来创建一个Cipher来创建一个SealedObject)

这在Java中是否可行,我应该考虑使用哪种类/方法组合?

Eug*_*hov 17

对于AES加密:

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);

byte[] iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

// reinit cypher using param spec
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
Run Code Online (Sandbox Code Playgroud)

同样,对于与旧系统学习目的进行通信的已弃用的PBKDF1和不安全的DES :

byte[] salt = {
    (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
    (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
};

int count = 20;

PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count);
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);

Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
cipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

SealedObject sealed = new SealedObject(object, cipher);
...
Run Code Online (Sandbox Code Playgroud)

请注意,在上一个示例中,迭代计数也太低了.

  • 如果你删除了上半场,这将是一个更好的答案.DES今天完全被打破了,即使作为一个例子使用它也是危险的(人们可能会复制它而不知道它是不安全的). (4认同)

imi*_*ers 5

您想为此使用PBKDF2bcrypt。根据我的经验,前者使用更广泛。根据此评论,看来 java 确实支持这一点。

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Run Code Online (Sandbox Code Playgroud)