【问题标题】:byte[] to String returns different Stringbyte[] 到 String 返回不同的 String
【发布时间】:2015-11-10 06:59:21
【问题描述】:

对于给定的byte[],总是一样的,我想得到对应的String。 byte[] result 始终具有相同的值。

但是返回的字符串永远不会相同,每次我启动我的应用程序时,结果都会改变。

byte[] results = cipher.doFinal(text.getBytes("UTF-8"));

String result = Base64.encodeBase64String(results);

我尝试了其他几种方法来获取我的字符串,例如String result = new String(results, "UTF-8");Array,...但每次都不同。

这是在密码加密之后发生的。完整代码如下:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5padding");
byte[] keyBuf= new byte[16];

byte[] b= key.getBytes("UTF-8");
int len= b.length;
if (len > keyBuf.length) len = keyBuf.length;

System.arraycopy(b, 0, keyBuf, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBuf, "AES256");


byte[] ivBuf= new byte[16];
            //IvParameterSpec ivSpec = new IvParameterSpec(ivBuf);
IvParameterSpec ivSpec=null; 

cipher.init(Cipher.ENCRYPT_MODE, keySpec);

byte[] results = cipher.doFinal(text.getBytes("UTF-8"));

String result = Base64.encodeBase64String(results);
return result;

如何确保字符串“结果”保持不变?

【问题讨论】:

  • 字节数组每次都不一样吗?
  • 不,精确的字节数组保持不变。
  • 什么是Base64?你有它的文档的链接吗?
  • 为什么不直接使用 Android 中的 Base64 类? (不是 base64 转换是这里的问题 - 它是加密代码......)
  • 您给出的代码还有另一个问题 - 您只要求“AES”作为密码,但创建了一个 AES256 密钥。那行不通-至少在我的机器上不行。使用“AES”创建密钥有效 - 然后每次提供具有相同 IV 字节的 IV 规范每次都会产生相同的结果。

标签: java android string encryption bytearray


【解决方案1】:

每次加密时都使用不同的 IV - 因此每次加密时也会得到不同的密文。您的results 字节数组每次都不同,因此base64 表示方式不同。

如果您真的想在每次加密相同的输入时获得相同的结果,则每次都需要使用相同的 IV...但请注意,这会显着降低安全性。 (请注意,目前您甚至没有对 ivSpec 做任何事情。您可能希望将其作为第三个参数传递给 Cipher.init... 但您希望使用 IV 对其进行初始化,而不是只是使用null。)

【讨论】:

  • 但是由于IvParameterSpec设置为null,那么每次都应该一样吧?同样使用 Log,看来 byte[] results.toString() 总是相同的。
  • @Virthuss:不,因为 a) 你没有使用它,b) 我希望 null 表示“生成一个新的”。在 byte[] 上调用 toString() 也并不表示其中的数据 - 如果这是您一直依赖的确定结果是否相同,您应该问自己您认为您看到的是什么表示.尝试转储 results 中的每个字节...
  • 我怎样才能确保 IV 将保持不变呢?为其分配一个固定的 byte[] 或 null 并将其添加为第三个参数并不会阻止最终结果发生变化...
  • @Virthuss:好吧,如果您发布了一个简短但完整的示例,我很容易测试该断言。我怀疑如果你用一个固定的字节数组初始化它,那么你得到相同的结果......但是从你发布的内容到一个完整的程序来证明这需要一点时间.如果您编辑问题以使其更容易,它会更容易帮助您...见stackoverflow.com/help/mcve
  • 我以为更改的字符串来自 Base64,但似乎我检查 byte[] 值的方式并不是最好的,因为实际上每次都有一些差异。所以真正的问题实际上是你提到的 IV 以及我使用它的糟糕方式......非常感谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多