Próbuję zrozumieć, jak dostawcy bezpieczeństwa Java działają na Androidzie. Chciałbym wymusić wszystkie wywołania funkcji Cipher.getInstance(), aby zwrócić szyfr jako gąbczasty zamek jako dostawcę. Nie mam szczęścia.Android rejestrujący dostawcę zabezpieczeń
Poniższy kod zwraca szyfru z dostawca jest "AndroidKeyStoreBCWorkaround wersja 1.0", ale chcę dostawcą być SpongyCastle.
Powodem, dla którego chcę to zrobić, jest to, że mam bibliotekę, która wielokrotnie wywołuje funkcję javax.crypto.Cipher.getInstance(). Chcę, aby wszystkie te połączenia trafiały do gąbczastego zamku, bez konieczności ponownego pisania biblioteki, aby wyraźnie określić "SC" jako dostawcę.
public class MainActivity extends Activity
{
static
{
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
Security.removeProvider("BC");
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
try
{
//this returns provider = "AndroidKeyStoreBCWorkaround version 1.0"
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES/CTR/NoPadding");
//this works
// cipher = javax.crypto.Cipher.getInstance("AES/CTR/NoPadding", "SC");
}
catch(Exception e)
{
}
}
}
'Security.insertProviderAt' zwraca pozycję, przy której dostawca jest dodawany. Czy możesz sprawdzić, czy nie jest "-1" (co oznacza, że nie dodano)? – rds
Dlaczego nazywasz 'Security.removeProvider (" BC ")' zaraz po zainstalowaniu dostawcy? – rds
@rds: org.spongycastle.jce.provider.BouncyCastleProvider = "SC" i NIE "BC". Wstawia Spongy, a następnie usuwa Bouncy. – JDOaktown