Android注册安全提供程序

mar*_*who 9 java security encryption android

我试图了解java安全提供程序如何在android中工作.我想强制所有对Cipher.getInstance()的调用返回一个带有海绵城堡作为提供者的密码.我没有运气.

以下代码返回一个提供者为"AndroidKeyStoreBCWorkaround版本1.0"的密码,但我希望提供者为SpongyCastle.

我想这样做的原因是,我有一个多次调用javax.crypto.Cipher.getInstance()的库.我希望所有这些调用都能进入海绵城堡,而不必重新编写库以明确指定"SC"作为提供者.

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)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 3

您只需要编写另一个类来调用 javax.crypto.Cipher.getInstance 并向其传递“SC”变量。您应该能够在不对原始库进行任何更改的情况下执行此操作,并且可以在与您提供的代码相同的文件中执行此操作。虽然这个答案看起来过于简单,所以也许您的问题还有其他方面?无论如何,这就是答案。