public static String encrypt(String alias, String plaintext) {
try {
PublicKey publicKey = getPrivateKeyEntry(alias).getCertificate().getPublicKey();
Cipher cipher = getCipher();
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return Base64.encodeToString(cipher.doFinal(plaintext.getBytes()), Base64.NO_WRAP);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static KeyStore.PrivateKeyEntry getPrivateKeyEntry(String alias) {
try {
KeyStore ks = KeyStore
.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (entry == null) {
Log.w(TAG, "No key found under alias: " + alias);
Log.w(TAG, "Exiting signData()...");
return null;
}
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.w(TAG, "Not an instance of a PrivateKeyEntry");
Log.w(TAG, "Exiting signData()...");
return null;
}
return (KeyStore.PrivateKeyEntry) entry;
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
return null;
}
}
谢谢!
Sonic给出的答案是正确的,因为用于对应用程序进行签名的Java密钥存储与应用程序中使用的密钥存储不同。前者是你的开发机器(笔记本电脑)上的一个文件,而后者只在你安装应用程序的手机上(Android手机或模拟器)。签署您的apk以便它可以在Play Store上发布,以及在您的数据上加密用户的私有数据是不同的过程。
在不清楚的情况下,您应该尝试参考规范的来源,而不是质量差异很大的任意的指南和教程。在这种情况下,KeyStore的官方Android文档有一个存储密钥的完整示例。请注意,Gist中引用的Android密钥库仅在API18+上可用。
诚然,官方文档和要旨中的代码示例相当复杂,很容易出错。一个更好的选择可能是像Scytale这样的东西。它是一个围绕密钥存储库的包装器,可以正确处理API<18的情况。下面是要演示的代码段:
Store store = new Store(getApplicationContext());
if (!store.hasKey("test")) {
SecretKey key = store.generateSymmetricKey("test", null);
}
...
// Get key
SecretKey key = store.getSymmetricKey("test", null);
// Encrypt/Decrypt data
Crypto crypto = new Crypto(Options.TRANSFORMATION_SYMMETRIC);
String text = "Sample text";
String encryptedData = crypto.encrypt(text, key);
Log.i("Scytale", "Encrypted data: " + encryptedData);
String decryptedData = crypto.decrypt(encryptedData, key);
Log.i("Scytale", "Decrypted data: " + decryptedData);
if there is no key in the keystore with that alias
make a new key with that alias
use the key to encrypt and decrypt data.
任务“:app:signReleaseBundle”的执行失败。 执行com时发生故障。Android建筑格雷德尔。内部的任务。Workers$ActionFacade未能从存储“C:\Users\alank\OneDrive\Desktop\Flatter\U app\new app\newapp\android\app\key.jks”读取密钥上载:在密钥库C:\Users\alank\One
我们的android项目由移动和wear应用组成(wear应用正在开发中),我们正在尝试发布移动应用。当我们尝试生成签名的apk时,会得到以下消息: 当它读它说失败的任务:磨损:包装eRelease,实际上我们只是选择移动,而选择签署APK。 有人能指出我的错误吗?提前道谢。
我跟着弗利特。div给出了如何将我的应用部署到google play上的说明,但当我在vs代码中运行Flatter build appbundle时,我遇到了一个问题,它说 执行com时发生故障。Android建筑格雷德尔。内部的任务。Workers$ActionFacade未能从存储“c:\Users\iikxz\upload keystore.jks”读取密钥:在keystore c:\Use
别名s1as被上述命令中使用的别名所取代,即server-alias(在下,上的SSL选项卡)。 jks和cacerts.jks存储在下。 下的JVM选项,上的JVM选项选项卡,以下选项 GlassFish服务器不喜欢什么? 它只在使用别名重新生成这些文件keystore.jks和cacerts.jks时工作,但当使用不同的别名(证书昵称)时,它会失败,出现给定的异常。GlassFish似乎将这个
我是Android安全方面的新手。我已经使用Androidkeystore保存应用程序机密。为了从Android keystore中获得保存的密钥,我需要在每次别名密钥中传递我在加密时传递过的内容。所以,我的问题是,我还想安全地保存别名密钥。因此,没有一个键通过查看代码看到别名键。请帮帮我。
null 生成公钥/私钥对,其中私钥从不离开密钥库 将此对的公钥上载到服务器 在服务器上:创建随机对称AES密钥,并用用户上传的公共RSA密钥加密 在设备上:下载此加密的AES密钥 将其导入到硬件支持的密钥存储库中,以便使用该对的私钥对其进行解密,并以新别名存储 使用此新密钥别名执行对称加密和解密 1-4应该是可能的,我现在缺少的环节是第5点。在这个列表中。有没有人可以帮助我,告诉我这是不是可能的