我想将安全数据存储在密钥库中。 因此我使用
KeyStore store = KeyStore.getInstance("JCEKS");
但Android似乎不知道“JCEKS”。
04-18 10:52:17.236: WARN/System.err(474): java.security.KeyStoreException: KeyStore JCEKS implementation not found
尝试JKS会产生同样的错误。 什么算法在android上使用它很好?
答案 0 :(得分:10)
Android似乎正在使用bouncycastle提供商。这是api返回的默认提供程序。要确定设备上默认哪个可用,请使用KeyStore.getDefaultType()
。
在我的情况下,这返回了'BKS'。当有'。'时似乎也有例外。密钥库文件路径中的字符。
当我将商店存储到包含我的包名称的文件夹时(如Android文档中所推荐的那样),它导致了异常。
您也可以查看this。
答案 1 :(得分:4)
您是否在尝试访问密钥库之前加载了密钥库?错误消息是否恰好在getInstance指令处发生?
有些谷歌搜索说“PKCS12”适用于少数人,可以随意使用。
答案 2 :(得分:2)
你需要充气城堡钥匙店(BKS)。 看看here
答案 3 :(得分:2)
使用它KeyStore keyStore = KeyStore.getInstance("PKCS12");
使用工具“KeyTools Explorer”创建密钥库!
答案 4 :(得分:1)
这对我有用:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
请记得在致电KeyStore.load(KeyStore.LoadStoreParameter param)
之前致电KeyStore.getEntry (String alias, KeyStore.ProtectionParameter param)
,即
keyStore.load(null);
KeyStore.Entry keyStoreEntry = keyStore.getEntry(alias, null);
答案 5 :(得分:0)
这可能会有所帮助:
请参阅https://github.com/nelenkov/ecdh-kx/blob/master/src/org/nick/ecdhkx/Crypto.java
static public void listAlgorithms( String algFilter ){
java.security.Provider[] providers = java.security.Security.getProviders();
for ( java.security.Provider p : providers ){
String providerStr = String.format( "%s/%s/%f\n", p.getName(), p.getInfo(),
p.getVersion() );
mLog.debug( providerStr );
Set< Service > services = p.getServices();
List< String > algs = new ArrayList<>();
for ( Service s : services ){
boolean match = true;
if ( algFilter != null ){
match = s.getAlgorithm().toLowerCase().contains( algFilter.toLowerCase() );
}
if ( match ){
String algStr = String.format( "\t%s/%s/%s", s.getType(),
s.getAlgorithm(), s.getClassName() );
algs.add( algStr );
}
}
Collections.sort( algs );
for ( String alg : algs ) mLog.debug( "\t" + alg );
mLog.debug( "" );
}
}//listAlgorithms