首页
学习
活动
专区
圈层
工具
发布

AES盐渍
EN

Stack Overflow用户
提问于 2013-04-23 21:41:16
回答 2查看 436关注 0票数 0

我有点加密新手,但需要加密敏感的个人数据,然后才能存储在数据库。我本来打算和CBC一起使用AES,但也想用盐。但是,我无法找到一种方法(除了我的主机出于某种原因不准备允许的BouncyCastle ),所以我决定自己添加一个字符串,在要加密的文本末尾添加一个随机字符串:

代码语言:javascript
复制
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);

我想我有三个问题:

  1. 有更好的方法在我的加密中加入盐吗?
  2. 在类似于此的例子中,似乎总是在开始时生成一个随机密钥,并在加密之后立即进行解密。这是一个不太可能的场景--所以我的工作基础是每次我都应该使用相同的键(看起来不需要思考,但我看到的所有例子似乎都是随机的)。看不出它还会如何工作,但是有人能确认:)
  3. 使用固定密钥时,我注意到如果继续加密相同的字符串,我确实会得到不同的结果,但只有加密结果的末尾部分会发生变化。似乎不对。怎么会这样?

非常感谢,尼尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-23 21:46:57

盐渍通常是在散列密码时完成的,而不是在加密明文时完成的;例如,在使用PBEKeySpec从密码生成密钥时使用salt。AES的“盐”是它的初始化向量。

在加密相同的明文时,您将得到相同的密文,因为每次都使用相同的初始化向量--您需要将IV随机化(例如使用SecureRandom),或者需要从计数器生成IV。IV不是秘密的(可以用明文传输),解密器需要使用与加密器相同的IV。

票数 3
EN

Stack Overflow用户

发布于 2013-04-23 21:51:46

你为什么在课文里加盐?它什么也做不了。

Salt通常用于破解密码,击败彩虹表。工作如下:假设用户输入密码"qwerty“。您生成一个16字节长的随机字符串( rs ),将其添加到密码中,并对结果字符串进行散列,然后接受哈希,将rs添加到其中,并将结果字符串存储在数据库中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16179657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档