2015-03-13 131 views
0

我在Java SE和Android项目上使用相同的代码。运行在Java和Android上的应用程序连接到相同的MQTT代理并交换消息。消息使用AES加密/解密。我有一个Java安全体系结构的经验非常少,所以我的问题是:Java和Android之间的加密/解密

1)我应该期待什么,如果我使用相同的密码算法,但来自不同供应商(一个Java和其他Android上的)?使用不同的提供程序解密用另一提供程序加密的消息是否自动表示该消息不会被成功解密?

2)什么是推荐的供应商使用,将允许Java和Android应用程序在这种情况下,正确的沟通?我在网上看到了一些答案,但有些答案相对较旧,所以我不确定它们是否仍然是最佳答案。

+2

AES是标准。假设你使用的是同一个秘密,那么你正在使用哪个实现并不重要 – odedsh 2015-03-13 09:40:15

+0

当算法未完全指定时,提供者之间当然存在差异。不要忘记指定操作模式和填充。不要使用'Cipher.getInstance( “AES”);',而是'Cipher.getInstance( “AES/CBC/PKCS5Padding”);'甚至更好的认证加密,如GCM或CCM是由BouncyCastle的提供。 – 2015-03-13 10:09:53

+0

在Java SE上使用'BouncyCastle'和在Android上使用'SpongyCastle'。同一版本。 – EpicPandaForce 2015-03-13 10:25:25

回答

1

如果我使用相同的Cipher算法,但来自不同的提供者(一个在Java上,另一个在Android上),我应该期待什么?

相同的结果。

是否使用不同的提供程序来解密用另一个提供程序加密的消息会自动表示该消息不会被成功解密?

2)什么是推荐的供应商使用,将允许Java和Android应用程序在这种情况下,正确的沟通?

的一个内置的JRE,假设它支持AES。

但我不知道为什么你没有使用SSL。

+0

谢谢你的回答。正在启用SSL。就所使用的提供者而言,您是否会建议我不在代码中指定提供者名称,而是让代码使用默认提供者?这会在100%的时间内工作吗? – Branex 2015-03-13 10:08:29

+0

如果它在两端都起作用,它应该100%的时间工作。这并不免除你必须亲自测试它。你最好直接跳到SSL。没有意义建立两个不兼容的产品版本,其中一个具有可疑的安全性。 – EJP 2015-03-13 10:21:40