Articles of 加密

触摸三星手机上的指纹后出错:android.security.KeyStoreException:未经过身份validation的密钥用户

我的应用程序使用Android 6.0 Fingerprint API来保护Android KeyStore中的AES密钥。 只有在用户通过指纹传感器进行身份validation时才能使用存储的密钥,因为KeyGenParameterSpec是使用setUserAuthenticationRequired(true)初始化的。 当用户触摸传感器时,我从onAuthenticationSucceeded(Cipher)的回调中获得初始化的密码,并将其用于解密。 除了使用Android 6的三星手机外,这种方法效果很好。当我尝试使用返回的密码时,三星手机有时会抛出android.security.KeyStoreException: Key user not authenticated 。 因此,即使密码由onAuthenticationSucceeded(Cipher)返回,Android KeyStore也认为用户未被指纹传感器validation。 似乎崩溃发生在应用程序长时间不使用时。 当应用程序崩溃时,通常都能正常工作。 由于这个错误是随机发生的,只在三星手机上发生……这似乎是由Android 6.0 KeyStore和FingerPrint API的三星实现中的一些内部时序问题引起的。 编辑 :在OnePlus和Acer手机中也遇到过这个问题。

在Android 2.3.3上实现TLS 1.2

我一直在尝试在Android上实现TLS 1.2。 我创建了一个SSLSocket但是当我运行s.getSupportedProtocols()时,TLS 1.2不是其中一个选项。 支持TLSv1和SSLv3但不支持TLSv1.2。 关于那个问题,我需要的密码套件也不在那里(TLS_ECDHE_ECDSA_WITH_AES_256 _…) 关于我可以导入或做什么来启用TLSv1.2和android上的密码的任何想法? 有什么我想念的吗? 任何想法都会有所帮助! 谢谢!

存储密码

我正在创建一个用于存储加密数据的应用程序。 在这个问题中,OP si建议明确存储用户的凭证。 但是,如果我想存储使用SecretKeySpec(用于加密数据的密码)创建的加密密码,该怎么办? 根据我的理解,密钥本身是加密的。 所以我可以存储和检索它。 注意:我不是在询问如何存储首选项,只要我了解SecretKeySpec如何工作以及如何排序,序列化和检索加密密码。 编辑 :对不起,我忘了指定它需要与API级别4兼容。

使用Node.js加密模块加密并使用Java解密(在Android应用程序中)

寻找一种方法来加密节点中的数据(主要是字符串)并在android应用程序(java)中解密。 已成功完成每个(在节点中加密/解密,并在java中加密/解密)但似乎无法让它在它们之间工作。 可能我不是以相同的方式加密/解密,但每种语言中的每个库对于相同的事物都有不同的名称…… 任何帮助赞赏。 这是一些代码:Node.js var crypto = require(‘crypto’) var cipher = crypto.createCipher(‘aes-128-cbc’,’somepass’) var text = “uncle had a little farm” var crypted = cipher.update(text,’utf8′,’hex’) crypted += cipher.final(‘hex’) //now crypted contains the hex representation of the ciphertext 和java private static String decrypt(byte[] raw, byte[] encrypted) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, “AES”); Cipher […]

PHP中的AES解密的AES 128加密

我一直在尝试使用AES-128 CBC解密字符串,该CBC最初使用JAVA AES加密进行加密。 在java中使用PKCS7填充。 我尝试使用类似的PHP代码加密和解密。 但是我得到了不同的结果。 我的Java代码 import java.security.MessageDigest; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; /** * @author vipin.cb , vipin.cb@experionglobal.com * Sep 27, 2013, 5:18:34 PM * Package:- com.veebow.util * Project:- Veebow * */ public class AESCrypt { private final Cipher cipher; private final SecretKeySpec key; private AlgorithmParameterSpec spec; public […]

良好的软件工程与安全性

安全和设计指南详细介绍了各种方法,使攻击者更难以破解应用内计费实施。 特别值得注意的是,即使通过Proguard进行模糊处理,对.apk文件进行逆向工程也是多么容易。 因此,他们甚至建议修改所有示例应用程序代码,尤其是“已知的入口点和出口点”。 我发现缺少的是在单个方法中包含某些validation方法的任何引用,例如返回boolean的静态Security.verify() :一个好的设计实践(减少代码重复,可重用,更容易调试,自我记录等等) 。)但攻击者现在需要做的就是识别该方法,并使其始终返回true …因此无论我使用它多少次,延迟或不延迟,随机或不随意,它都无所谓。 另一方面,Java没有像C / C ++那样的宏,它允许减少源代码重复,但没有一个verify()函数的退出点。 所以我的问题: 众所周知的软件工程/编码实践与所谓安全设计之间是否存在内在争用? (至少在Java / Android /安全交易的背景下) 可以采取哪些措施来缓解“安全设计”的副作用,这种副作用在过度复杂的软件方面看起来像是“在脚下拍摄”,这些软件本来可以更简单,更易于维护和更容易调试? 你能推荐一些好的资料来进一步研究这个课题吗?

使用ExoPlayer重现加密video

我在Android中使用ExoPlayer ,我正在尝试重现本地存储的加密video。 ExoPlayer的模块化允许创建可以在ExoPlayer中注入的自定义组件,这似乎就是这种情况。 实际上,经过一些研究后我意识到,为了实现这个任务,我可以创建一个自定义DataSource并覆盖open() , read()和close() 。 我也find了这个解决方案 ,但实际上这里整个文件只需一步解密并存储在一个清晰的输入流中。 在许多情况下这可能是好的。 但是,如果我需要重现大文件怎么办? 所以问题是:如何在ExoPlayer中重现加密video,“在线”解密内容(不解密整个文件)? 这有可能吗? 我尝试创建一个具有open()方法的自定义DataSource: @Override public long open(DataSpec dataSpec) throws FileDataSourceException { try { File file = new File(dataSpec.uri.getPath()); clearInputStream = new CipherInputStream(new FileInputStream(file), mCipher); long skipped = clearInputStream.skip(dataSpec.position); if (skipped < dataSpec.position) { throw new EOFException(); } if (dataSpec.length != C.LENGTH_UNBOUNDED) { bytesRemaining = […]

Android:使用存储在文件中的公钥解密RSA文本

我已经好几天没试成功了。 StackOverflow中有很多类似的问题,甚至其中两个与我的完全相同,但是没有答案和未解决:1) 将PHP RSA PublicKey转换为Android PublicKey 2) Android:如何使用RSA密钥解密openssl加密文件? 我的场景:我有一些使用RSA加密的文本(未经我加密)。 我在res / raw文件夹中有一个“public.key”文件,其中包含解密所需的公钥(与用于加密消息的私钥相关的公钥),格式如下例所示: 我看到很多关于如何解密RSA文本的例子,如下所示: public static byte[] decryptRSA( PublicKey key, byte[] text) throws Exception { byte[] dectyptedText = null; Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(text); return dectyptedText; } 但我的问题是,如何从文件中获取正确的PublicKey实例? 没有这方面的例子。 如果我只是尝试: InputStream is = getResources().openRawResource(R.raw.public); DataInputStream dis = new DataInputStream(is); byte [] keyBytes […]

如何validationWeb服务调用的来源

假设您有一个移动应用程序(Windows Phone或Android),它使用SOAP连接您的后端。 为了方便起见,我们假设我们有一个用C#实现的Web服务。 服务器公开以下方法: [WebMethod] public string SayHallo() { return “Hallo Client”; } 从服务器的角度来看,您无法判断调用者是您的移动应用程序还是尝试调试Web服务的开发人员或试图对您的后端进行反向工程/利用的黑客。 如何识别Web服务调用的来源是应用程序? 任何拥有WSDL的人都可以调用WS。 我知道我可以对Web服务实施一些标准的安全措施,例如: 在服务器上实施HTTPS,使邮件加密,减少窃听的危险。 使用摘要/散列算法在客户端对请求进行签名,validation服务器中的签名并拒绝未正确签名的消息。 在HTTP请求中编写自定义标头。 无论如何都可以模拟标题。 但是,任何经验丰富的黑客或知道签名算法的开发人员仍然可以生成签名良好,格式正确的消息。 或者一个非常好的黑客可以反汇编应用程序并访问我的“绝密”通信协议的隐藏技术。 任何想法如何使SayHallo()方法只回答我的移动应用程序的请求? 我们在移动应用程序的环境中运行,通过硬件访问,可以利用硬件function完成某些任务。 如果有人想知道,我正在考虑如何使移动应用程序足够安全,以便敏感的应用程序,如银行业务。 谢谢你的想法。

为什么Android 24+上的AES加密/解密速度要慢3倍?

你可以跳到TL; DR 我们有一个应用程序,它强烈依赖于AES加密和解密。 我们希望尽可能多地支持设备,但其中一些(特别是糟糕的平板电脑,我不仅仅是指中文无名,还有一些来自三星或联想的低端平板电脑)加密和解密速度很慢。 我们在我们的应用程序中使用了Android 23,我们能够确定某种级别,在这种级别之下,我们的应用程序根本不适合最终用户(他们必须等待太长时间才能显示内容)。 很多平板电脑我们不得不排除在我们的应用程序中使用,但是,我们能够忍受它。 最近我们的一些依赖项开始需要更新版本的Android。 例如,我们想切换到Facebook Core SDK,而不是完整的Facebook SDK以节省一些空间。 但这取决于Android支持包v25,我们将无法构建它,因为proguard拒绝处理源。 因此决定将项目转移到更新的Android。 除了对我们的加密/解密机制产生的性能影响之外,它还非常顺利。 突然间,它慢得多。 平板电脑我们认为“工作得很好”非常慢。 TL; DR 我已经开始调查从Android 23迁移到Android 26期间发生的事情,这会导致AES加密/解密性能大幅下降。 我已经创建了一个应用程序,它可以作为一种基准。 通过简单的改变: compileSdkVersion 23->26 targetSdkVersion 23->26 compile ‘com.android.support:appcompat-v7:VERSION’ 23.4.0 -> 26.+ 性能下降是巨大的。 以下是其中一款平板电脑的示例结果: Android 23: 136959 B/s Android 26: 34419 B/s 这几乎慢了4倍。 我可以在我必须测试的所有设备上重现这些结果。 当然,在新的高性能设备上它几乎看不到,但在旧设备上,很明显。 我在网上搜索了有关此的任何细节,但我什么也没find。 我真的很感激有人能够解释这个问题。 我真的希望我在某处犯了错误,但我找不到它。 对于加密/解密,我们使用SpongyCastle库。 我的Crypto Tester应用程序的源代码可以在GitHub上find: https : //github.com/krstns/cryptoTester […]