Articles of 密码学

是否可以使用SIM卡密码function?

所有智能卡都具有embedded式encryptionfunction和计算能力。 用开发的android应用程序可以利用这个吗? 例如,我能否使用存储在SIM上的公钥/私钥来签名文件。 我听说过一些标准和规范和举措(ETSI-MSS,Mobile PKI),但是我没有看到这样的架构的任何应用。 有人对此有一些线索吗?

解密错误:“一个预期的时候没有设置”

我几乎不熟悉encryption。 我想解密一个字节数组,当我提供IV时,我得到一个exception:InvalidAlgorithmParameterException(当预期的时候没有设置iv)。 这里是我的代码( iv是一个16字节的数组,它不是null,并且在encryption时使用这个值): Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, encriptionKey,new IvParameterSpec(iv)); 如果我不指定IV,密码被初始化好: Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, encriptionKey); 试图find一个答案我find了JCEStreamCipher( 这里 )的实现,可能不符合我使用的版本,但有一些代码,使我的事情,我不正确的理解。 代码如下: if ((ivLength != 0) && !(param instanceof ParametersWithIV)) { SecureRandom ivRandom = random; if (ivRandom == null) { ivRandom = new SecureRandom(); } if ((opmode == Cipher.ENCRYPT_MODE) || (opmode == Cipher.WRAP_MODE)) { byte[] […]

Android Studio:安装失败,因为APK没有签名

我正试图在模拟器中运行我的应用程序,并收到以下错误: 由于APK未签名或签名不正确,安装失败。 如果这是一个基于Gradle的项目,那么确保在Gradle构build脚本中指定了签名configuration。 我试图用debugging设置运行应用程序,所以签名应用程序不应该是必要的,因为它将被build立一个临时签名。

如何validationWeb服务调用的来源

假设您有一个使用SOAP连接您的后端的移动应用程序(Windows Phone或Android)。 为了简单起见,假设我们有一个用C#实现的Web服务。 服务器公开以下方法: [WebMethod] public string SayHallo() { return "Hallo Client"; } 从服务器的angular度来看,您无法确定调用者是您的移动应用程序,还是试图debugging您的Web服务的开发人员,或是试图对您的后端进行反向工程/开发的黑客。 如何识别Web服务调用的来源是应用程序? 因为任何拥有WSDL的人都可以调用WS。 我知道我可以对Web服务执行一些标准的安全措施,如: 在服务器上实现HTTPS,消息传输encryption,窃听的危险降低。 使用摘要/散列algorithm在客户端上签名请求,validation服务器中的签名并拒绝未正确签名的消息。 在HTTP请求中写入自定义标头。 反正头可以被模拟。 然而,任何经验丰富的黑客或知道签名algorithm的开发人员仍然可以生成一个标识良好,格式良好的消息。 或者一个非常好的黑客可以拆卸应用程序,并获得我的“绝密”通信协议隐藏的知识。 任何想法如何使SayHallo()方法只回答来自我的移动应用程序的请求? 我们正在运行一个移动应用程序的上下文,通过硬件访问,可能会有一些东西可以利用硬件的function。 如果有人想知道,我正在考虑如何使一个移动应用程序足够安全的敏感应用程序,如银行业务,例如。 感谢您的想法。

在Android M和旧版本中使用KeyStoreencryption和解密用户名?

我试图使用KeyStoreencryption和解密应用程序中的用户名, 使用KeyPairGeneratorSpec来创build18到22之类的旧版本的密钥, KeyPairGeneratorSpec已经在android M版本23中被删除,但Android M支持KeyGenParameterSpec。 这个KeyGenParameterSpec是否支持向后可比性?或者我该如何做? 我试着这样的事情,有没有更好的解决scheme。 这工作正常,现在closures! 在encryption和解密Ciper.getInstance时,我需要做到这一点。 有什么单一的参数“RSA / ECB / OAEPWithSHA-256AndMGF1Padding”或“RSA / ECB / PKCS1Padding”我可以通过这两个版本 ? if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); }else{ c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); } 下面的代码现在工作正常,让我知道如何改善这一点。 密钥生成器: genkey(){ KeyPairGenerator generator = KeyPairGenerator .getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ TCLog.e(TAG,"Current version is 23(MashMello)"); //Api level 23 KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder( keyName, […]

使用ECC Curve25519在Java中encryption/解密数据

我正在尝试在我的Android应用程序中使用Curve25519来本地encryption/解密AESencryption密钥。 我不需要任何密钥交换,密钥协议或签名。 为什么我需要使用特定的曲线? 因为我需要能够提供私人密钥,并能够计算出它的匹配公钥。 所以,据我所知,只有Curve25519这样做。 如果我错了,请纠正我。 所有的Curve25519实现只是进行密钥生成,密钥交换和签名/validation。 在获得Curve25519私钥/公钥之后,是否可以进行数据encryption/解密?或者您可以build议符合我的标准的其他曲线? 编辑 那么为什么我需要这个? 我会更仔细地解释。 我的应用程序正在做本地文件encryption,特别是照片。 我的目标是能够让用户在不input密码的情况下拍照,然后input密码查看。 为此,我需要能够从密码创build公钥/私钥对,并且能够在提供相同的密码时即时重新创build相同的密钥对。 所以在第一次运行时,我从密码生成ECC密钥对,并在设备上存储公钥。 当用户想要拍摄新照片时,应用随机的256位AES密钥对照片进行encryption,然后用存储的公钥对该密钥进行encryption。 当用户想要查看照片时,他/她提供正确的密码,我得到相同的ECC密钥对,并用我的私钥解密AES密钥,然后我可以使用AES 256解密照片。 所以据我所知Curve25519可以给我这个能力还是有其他的select。 Java中的代码示例欢迎!

为什么在Android 24+上,AESencryption/解密速度慢3倍以上?

你可以跳到TL; DR 我们有一个应用程序,它强烈依赖于AESencryption和解密。 我们希望支持尽可能多的设备,但其中的一些(尤其是蹩脚的平板电脑,我不仅仅是指中文无名字,还有一些来自三星或联想的低端平板电脑)的encryption和解密速度很慢。 我们在我们的应用程序中使用了Android 23,并且我们能够识别某种级别,在这种级别下,我们的应用程序将不能很好地为最终用户工作(他们将不得不等待内容出现太久)。 我们不得不排除使用我们的应用程序的很多平板电脑,但是,我们能够忍受这一点。 最近我们的一些依赖关系开始需要更新版本的Android。 例如,我们想切换到Facebook Core SDK,而不是完整的Facebook SDK来节省一些空间。 但是这取决于Android支持包v25,我们将无法构build它,因为proguard拒绝处理源。 所以决定把这个项目转移到一个更新的Android上。 除了对我们的encryption/解密机制的性能影响之外,它进行得非常顺利。 突然间慢了很多。 我们认为片子“足够好”的速度非常缓慢。 TL; DR 我已经开始调查从Android 23到Android 26的迁移过程中发生了什么,这会导致AESencryption/解密的性能下降。 我创build了一个应用程序,作为一种基准。 通过做一个简单的改变: 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倍。 我可以在所有必须testing的设备上重现这些结果。 当然,在新的,高性能的设备上,它几乎不可见,但在旧设备上,很明显。 我已经在网上search了这方面的任何细节,但是我什么都没find。 我真的很感激有人在这个问题上提出一些看法。 我真的希望我在某个地方犯了一个错误,但是我找不到。 对于encryption/解密,我们使用SpongyCastle库。 我的Crypto Tester应用程序的源代码可在GitHub上find: https : //github.com/krstns/cryptoTester […]

Android 4.2打破了我的encryption/解密代码,提供的解决scheme无法正常工作

首先,我已经看到Android 4.2打破了我的AESencryption/解密代码和encryption错误在Android 4.2和提供的解决scheme: SecureRandom sr = null; if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) { sr = SecureRandom.getInstance("SHA1PRNG", "Crypto"); } else { sr = SecureRandom.getInstance("SHA1PRNG"); } 对我不起作用,因为在解码Android 4.2中的Android 4.2中encryption的数据时,我得到: javax.crypto.BadPaddingException: pad block corrupted at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:709) 我的代码很简单,直到Android 4.2: public static byte[] encrypt(byte[] data, String seed) throws Exception { KeyGenerator keygen = KeyGenerator.getInstance("AES"); SecureRandom secrand = SecureRandom.getInstance("SHA1PRNG"); secrand.setSeed(seed.getBytes()); keygen.init(128, secrand); […]

Android中的MD5散列

我有一个简单的Android客户端需要“谈”到一个简单的C#HTTP侦听器。 我想通过在POST请求中传递用户名/密码来提供基本的身份validation级别。 在C#中MD5哈希是微不足道的,并提供足够的安全性,我的需求,但我似乎无法find如何做到这一点在Android端。 编辑:只是为了解决有关MD5的弱点提出的担忧 – C#服务器运行在我的Android客户端的用户的个人电脑上。 在很多情况下,他们将在自己的局域网上使用Wi-Fi访问服务器,但是他们可能select通过互联网访问它们,风险自负。 此外,服务器上的服务需要使用MD5传递给我无法控制的第三方应用程序。

Android支持哪些encryptionalgorithm?

我一直在Google上搜寻几个小时,却找不到任何可靠的答案,但传闻很多。 有谁知道文档是在哪里定义Android操作系统支持哪些encryption/签名/散列algorithm。 我从论坛听说,并不是所有的手机都支持相同的algorithm,所以我正在寻找每款Android手机支持的常用algorithm。