
我按照KeyGenParameterSpec类的JavaDocs中的Example进行 *** 作.密钥的生成,存储和加载工作.但是如果我尝试使用密钥,则密码对象的init()调用将失败.我调试了一下,我可以看到,加载的Key的类型为“androID.security.keystore.AndroIDKeyStoreSecretKey”.此实现可防止密钥的byte []被暴露.我出于安全原因理解这一点,但如果我想使用密钥,我必须获得关键内容.所以,我必须做错事.也许,在AndroID中使用加密 *** 作还有另一种方法吗?或者Key的加载代码是错误的?
这是代码:
KeyGenerator keyGenerator = KeyGenerator.getInstance( KeyPropertIEs.KEY_ALGORITHM_AES,"AndroIDKeyStore");KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("demo-alias",KeyPropertIEs.PURPOSE_ENCRYPT | KeyPropertIEs.PURPOSE_DECRYPT);builder.setKeySize(256);builder.setBlockModes(KeyPropertIEs.BLOCK_MODE_CBC);builder.setEncryptionpaddings(KeyPropertIEs.ENCRYPTION_padding_PKCS7);keyGenerator.init(builder.build());// this key will work with a CipherObject ...SecretKey key = keyGenerator.generateKey();// Load the key from the KeystoreKeyStore keyStore = KeyStore.getInstance("AndroIDKeyStore");keyStore.load(null);// This key will not work with the Cipher ObjectSecretKey notWorkingKey = (SecretKey) keyStore.getKey("demo-alias",null);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5padding");// That call failscipher.init(Cipher.ENCRYPT_MODE,key,new IvParameterSpec(new byte[]{87,99,-94,23,-17,26,84,-117,59,-59,25,-88,-66,86,-42,78}));byte[] crypted = cipher.doFinal("testdata".getBytes()); 密码的init(…)失败,出现以下异常:
java.lang.NullPointerException: Attempt to get length of null array at com.androID.org.bouncycastle.crypto.params.KeyParameter.<init>(KeyParameter.java:13) at com.androID.org.bouncycastle.jcajce.provIDer.symmetric.util.BaseBlockCipher.engineInit(BaseBlockCipher.java:557) at javax.crypto.Cipher.trytransformWithProvIDer(Cipher.java:608) at javax.crypto.Cipher.tryCombinations(Cipher.java:532) at javax.crypto.Cipher.getSpi(Cipher.java:437) at javax.crypto.Cipher.init(Cipher.java:909) at javax.crypto.Cipher.init(Cipher.java:859) at de.demo.crypt.LoginActivity.executeLogin(LoginActivity.java:95) at de.demo.crypt.LoginActivity.access0(LoginActivity.java:37) at de.demo.crypt.LoginActivity.onClick(LoginActivity.java:58) at de.demo.crypt.Actionbutton.buttonClicked(Actionbutton.java:104) at de.demo.crypt.Actionbutton.access0(Actionbutton.java:17) at de.demo.crypt.Actionbutton.onClick(Actionbutton.java:60) at androID.vIEw.VIEw.performClick(VIEw.java:5198) at androID.vIEw.VIEw$PerformClick.run(VIEw.java:21147) at androID.os.Handler.handleCallback(Handler.java:739) at androID.os.Handler.dispatchMessage(Handler.java:95) at androID.os.Looper.loop(Looper.java:148) at androID.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:616)解决方法 对Cipher.getInstance使用“AES / CBC / PKCS7padding”或“AES / CBC /”KeyPropertIEs.ENCRYPTION_padding_PKCS7.
AndroID Keystore仅支持AES的PKCS#7填充(请参阅https://developer.android.com/training/articles/keystore.html#SupportedCiphers).对于大于64位的块大小(AES使用128位块),技术上没有定义PKCS#5填充.通常情况下,当人们说PKCS#5填充时,他们的意思是PKCS#7填充.
您看到的特殊错误是因为Bouncy Castle错误地声称支持AES / CBC / PKCS5padding的AndroID Keystore密钥(请参阅Bouncy Castle问题跟踪器问题BJA-543).
P. S.最佳做法是让加密密码实现为您生成随机IV,而不是自己为密码提供IV – 您可以稍后使用Cipher.getIV()查询生成的IV.如果由于某种原因,您必须在加密时提供自己的IV,则在生成密钥时,您需要禁用密钥上的随机加密的默认要求(https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setRandomizedEncryptionRequired(boolean)).
总结以上是内存溢出为你收集整理的从AndroidKeystore加载私钥时出现问题全部内容,希望文章能够帮你解决从AndroidKeystore加载私钥时出现问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)