我有点加密新手,但需要加密敏感的个人数据,然后才能存储在数据库。我本来打算和CBC一起使用AES,但也想用盐。但是,我无法找到一种方法(除了我的主机出于某种原因不准备允许的BouncyCastle ),所以我决定自己添加一个字符串,在要加密的文本末尾添加一个随机字符串:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
String plainText = "This is my plain text";
System.out.println("**plainText: " + plainText);
String saltedPlainText = plainText + UUID.randomUUID().toString().substring(0, 8);
byte[] encrypted = cipher.doFinal(saltedPlainText.getBytes());
String encryptedText = new String(new Hex().encode(encrypted));
System.out.println("**encryptedText: " + encryptedText);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);
byte[] decrypted = cipher.doFinal(new Hex().decode(encryptedText.getBytes()));
saltedPlainText = new String(decrypted);
plainText = saltedPlainText.substring(0, saltedPlainText.length()-8);
System.out.println("**plainText: " + plainText);我想我有三个问题:
非常感谢,尼尔
发布于 2013-04-23 21:46:57
盐渍通常是在散列密码时完成的,而不是在加密明文时完成的;例如,在使用PBEKeySpec从密码生成密钥时使用salt。AES的“盐”是它的初始化向量。
在加密相同的明文时,您将得到相同的密文,因为每次都使用相同的初始化向量--您需要将IV随机化(例如使用SecureRandom),或者需要从计数器生成IV。IV不是秘密的(可以用明文传输),解密器需要使用与加密器相同的IV。
发布于 2013-04-23 21:51:46
你为什么在课文里加盐?它什么也做不了。
Salt通常用于破解密码,击败彩虹表。工作如下:假设用户输入密码"qwerty“。您生成一个16字节长的随机字符串( rs ),将其添加到密码中,并对结果字符串进行散列,然后接受哈希,将rs添加到其中,并将结果字符串存储在数据库中。
https://stackoverflow.com/questions/16179657
复制相似问题