我的团队需要开发一个解决方案来加密二进制数据(存储为byte [])在用 Java编写的 Android应用程序的上下文中.加密数据将以各种方式传输和存储,在此期间不能排除数据损坏.最终,另一个Android应用程序(再次用Java编写)将不得不解密数据.

已经确定加密算法必须是AES,密钥为256位.
但是,我想知道我们应该使用哪种AES实现和/或“模式”.我已经阅读了一些名为GCM模式的内容,我们已经对它进行了一些测试(使用BouncyCastle / spongycastle),但我并不完全清楚aes-gcm的用途是什么以及与普通相比它“购买”了什么AES – 以及是否需要考虑任何权衡.

以下是我们所关注/要求/问题的列表:

>填充:我们需要加密的数据并不总是128位的倍数,因此AES实现/模式应该添加填充,但仅在必要时添加.
我的印象是,一个简单的AES实现,例如由javax.crypto.Cipher提供的,不会这样做,但初始测试表明它确实如此.所以我猜测填充要求本身没有理由采用GCM而不是“普通”AES.那是对的吗?
>身份验证:我们需要一种万无一失的方法来检测是否发生了数据损坏.但是,理想情况下,我们还希望检测何时使用不正确的密钥进行解密.因此,我们希望能够区分这两种情况.我最初考虑GCM的原因是由于这个Stackoverflow question,其中一个响应者似乎暗示使用aes-gcm可以实现这种区分,尽管他没有提供详细的解释(更不用说代码)了.
>最小化开销:我们需要限制加密数据的存储和传输开销.因此,我们希望知道特定AES实现/模式的选择是否以及在何种程度上影响开销量.
>加密/解密性能:虽然这不是主要问题,但我们想知道特定AES实现/模式的选择在多大程度上影响加密和解密性能,无论是cpu时间还是内存占用.

提前感谢任何建议,澄清和/或代码示例.

编辑:德尔南有帮助地指出,没有“普通AES”这样的东西.所以澄清一下,我的意思是使用Java的内置AES支持.
像这样:Cipher localCipher = Cipher.getInstance(“AES”);

解决方法

在2012年,答案是选择GCM,除非您有严重的兼容性问题.

GCM是经过身份验证的加密模式.它一次性为您提供机密性(加密),完整性和身份验证(MAC).

到目前为止,正常的操作模式是ECB(这是Java的默认设置),CBC,CTR,OFB和其他一些操作模式.他们都只提供加密.如果没有诚信,保密本身很少有用;一个人必须以特别的方式将这些经典模式与完整性检查结合起来.由于密码学难以正确,因此这种组合通常是不安全的,比必要的慢或甚至两者兼而有之.

密码学家已经(最近)创建了经过身份验证的加密模式来解决该问题. GCM是最成功的之一:它已经被NIST选中,它高效,它是专利免费的,它可以携带额外的认证数据(即,数据保持清晰,但您可以验证其真实性) .有关其他模式的说明,请参阅this excellent article of Matthew Green.

引起您的关注:

>填充:默认情况下,Java使用PKCS#7填充.这是有效的,但它经常容易受到padding oracle attacks的影响,最好用MAC击败.GCM嵌入已经是MAC(称为GMAC).
>身份验证:aes-gcm仅接受一个AES密钥作为输入,而不是密码.它将告诉您AES密钥是否错误或有效负载是否已被篡改,但这些条件被视为一个.相反,您应该考虑使用适当的密钥派生算法(如PBKDF2或bcrypt)从密码中派生AES密钥.我认为始终无法判断密码是否错误或者有效负载是否已被修改,因为验证前者所需的数据总是会被破坏.您可以加密一个小的已知字符串(使用ECB AES),一起发送,并使用它来验证密码是否正确.
>最小化开销:在一天结束时,如果您需要身份验证,所有模式都会导致相同的开销(大约10-20个字节).除非您使用非常小的有效负载,否则可以忽略这一点.
>性能:GCM非常好,因为它是一种在线模式(无需缓冲整个有效载荷,因此内存较少),可并行化,并且每个明文块需要一次AES操作和一次galois乘法.像ECB这样的经典模式更快(每个块仅一个AES操作),但是 – 再次 – 您还必须考虑完整性逻辑,这可能最终比GMAC慢.

话虽如此,我们必须意识到GCM安全性依赖于良好的随机数生成来创建IV.

Android,AES-GCM或普通AES上的数据加密?的更多相关文章

  1. 使用Swift 3.0实现原生的MD5加密

    对称加密以DataEncryptionStandard数据加密标准算法即DES为典型代表,非对称加密通常以RivestShamirAdleman即RSA算法为代表。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法,如图2所示:图2MD5加密MD5的全称是MessageDigestAlgorithm5,即消息摘要算法第五版,是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。不同之处是在第16行的代码中,给NSData添加了一个名为MD5的扩展方式,用来实现数据的MD5加密

  2. Android,AES-GCM或普通AES上的数据加密?

    我的团队需要开发一个解决方案来加密二进制数据(存储为byte[])在用Java编写的Android应用程序的上下文中.加密数据将以各种方式传输和存储,在此期间不能排除数据损坏.最终,另一个Android应用程序(再次用Java编写)将不得不解密数据.已经确定加密算法必须是AES,密钥为256位.但是,我想知道我们应该使用哪种AES实现和/或“模式”.我已经阅读了一些名为GCM模式的内容,我们已经对

  3. 我的Android项目的FIPS合规性

    我正在开发一个与安全相关的项目,并且必须确保它符合FIPS标准.根据我的理解,FIPS合规性是硬件和软件级别的合规性.目前有2款三星Android设备符合FIPS标准,即它们在硬件和软件级别都具有合规性.我的问题如下:–1)如果我想让我的Android应用程序符合FIPS标准,如果我在我的项目FIPS兼容中使用了唯一的加密模块,这就够了吗?

  4. PHP实现的AES 128位加密算法示例

    这篇文章主要介绍了PHP实现的AES 128位加密算法,结合实例形式分析了AES 128位加密的相关概念、原理及php实现AES 128位加密的相关操作技巧,注释中包含详细的说明信息,需要的朋友可以参考下

  5. PHP的AES加密算法完整实例

    这篇文章主要介绍了PHP的AES加密算法,结合完整实例形式分析了php的AES加密算法类及其具体用法,具有一定参考借鉴价值,需要的朋友可以参考下

  6. PHP实现的AES双向加密解密功能示例【128位】

    这篇文章主要介绍了PHP实现的AES双向加密解密功能,结合实例形式分析了基于AES算法的加密解密类定义与使用技巧,需要的朋友可以参考下

  7. PHP实现的AES加密、解密封装类与用法示例

    这篇文章主要介绍了PHP实现的AES加密、解密封装类与用法,结合实例形式分析了php封装的aes加密解密操作类及相关使用技巧,需要的朋友可以参考下

  8. Vue中使用crypto-js AES对称加密算法实现加密解密

     在数字加密算法中,通过可划分为对称加密和非对称加密,本文主要介绍了Vue中使用crypto-js AES对称加密算法实现加密解密,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. AES加解密在php接口请求过程中的应用示例

    在我们的编程的过程中,经常会遇到加密的情况,怎么才会合理运用,本篇文章主要介绍了AES加解密在php接口请求过程中的应用示例,有需要的可以了解一下。

  10. php之Aes加密案例讲解

    这篇文章主要介绍了php之Aes加密案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部