有没有一种方法可以通过编程方式确定上次Android操作系统更新的日期?
我希望使用Android硬件支持的KeyStore,但我担心安全性和可用性.根据我在这里阅读的内容,当用户更改设备锁定时,KeyStore会被擦除,除非省略了setEncryptionRequired().出于可用性考虑,似乎需要这样做,否则一旦修改了设备锁,所有硬件支持的密钥都将被擦除.
但是,我还在这里读到,硬件支持的密钥实际上并不存储在TEE中,而是作为密钥文件存储在/ data/misc/keystore/user_0 /中,由存储在其中的设备特定密钥加密. TEE.由于设备锁定的更改会擦除KeyStore,因此设备特定密钥似乎是从设备锁定派生的.
出于安全原因,加密密钥文件是有意义的,否则任何root用户都能够读取密钥文件并提取私钥,因为他们可能已经清楚了.
所以我有点陷入两难境地.出于可用性考虑,我应该省略setEncryptionRequired(),但出于安全考虑,我应该设置setEncryptionRequired().
最后,是否可以使用setKeyEntry()将私钥导入硬件支持的KeyStore?我能够做到没有错误,但我不确定它是否是硬件支持的.
我的理解是否正确?
我有一个主要的活动,创造一个ListView和一个Custom Adapter.我能来填充ListView,如果我已经预先创建的列表,但我怎么与动态获取的数据来填充它?
主要活动
public class MainActivity extends Activity {
private ListView myListView;
private Context ctx;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.MainActivity);
ctx = this;
List<Items> myList = new ArrayList<Items>();
myList.add(new Item("Name 1", "Desc 1"));
myList.add(new Item("Name 2", "Desc 2"));
myList.add(new Item("Name 3", "Desc 3"));
myList.add(new Item("Name 4", "Desc 4"));
myList.add(new Item("Name 5", "Desc 5"));
myListView = (ListView)findViewById(R.id.list);
MyListAdapter myAdapter = new MyListAdapter(ctx,R.layout.listitem, myList);
myListView.setAdapter(myAdapter);
}
}
Run Code Online (Sandbox Code Playgroud)
MyListAdapter
public class MyListAdapter extends ArrayAdapter<Items> …Run Code Online (Sandbox Code Playgroud) 我正在尝试对AndroidKeyStore中的密钥执行RSA加密和解密。加密成功完成,但是当我尝试解密时,它引发InvalidKeyException:Cipher.init()上的密钥库操作失败。
这是我的密钥生成代码:
KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
AlgorithmParameterSpec spec = null;
spec = new KeyGenParameterSpec.Builder(mAlias,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build();
kpGenerator.initialize(spec);
KeyPair kp = kpGenerator.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)
这是我的加密代码:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null);
Cipher cip = null;
RSAPublicKey pubKey = (RSAPublicKey) entry.getCertificate().getPublicKey();
cip = Cipher.getInstance("RSA/ECB/NoPadding");
cip.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encryptBytes = cip.doFinal(challenge.getBytes());
String encryptedStr64 = Base64.encodeToString(encryptBytes, Base64.DEFAULT);
Run Code Online (Sandbox Code Playgroud)
这是我的解密代码:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null);
Cipher cip = null;
cip = …Run Code Online (Sandbox Code Playgroud) 有没有办法在不访问源代码的情况下获取 Android APK 文件使用的第 3 方库列表?
我在想两个选项:
1.使用LibRadar等工具进行检测。但是,据我所知,它使用基于签名的检测,因此并不全面。
2.使用jadx反编译APK文件,手动遍历所有不是app包名的源码文件夹。
例如,如果我的应用程序是 com.myapp,我将遍历 com/myapp 之外的所有源文件夹。
据我所知,这有两个问题:
一种。混淆的库将具有混淆的名称,因此我将检测到一堆库为 aaa 、 aab 等
湾 我不知道该停在哪里。例如,一个库的包名可能是com.somelibrary,但主文件夹下可能有多个子文件夹,例如com/somelibrary/a、com/somelibrary/b等。我不知道它的根文件夹是什么图书馆是。
在没有上述限制的情况下,是否有一种一致、准确的方式来列出 3rd 方库?
我希望向Android设备发送adb shell命令,该命令将输出从1命令传递到其他命令,但是当我尝试这样做时,仅在设备上执行第一个命令,而在主机上执行第二个命令。这是我尝试过的:
adb shell command1 | command2
Run Code Online (Sandbox Code Playgroud)
在设备上执行command1,在主机上执行command2。
我该如何使其正常工作?
谢谢!
我在有根的 Android 设备中运行 shell 脚本,我试图通过跟踪 shell 脚本生成的 stdout 输出(通过命令或回显)来调试它。是否可以通过将 stdout 重定向到 logcat 来做到这一点?
我希望能够检测我的活动是否被系统警报或其他叠加层(例如,长按电源按钮时的电源菜单)或检测到我的启动的恶意软件所遮盖活动。我注意到在这种情况下,前台应用程序仍将是我的应用程序,因此我不能简单地将其作为前台应用程序。我还注意到,当我的活动被遮盖时,不会调用onPause(),因此我也无法在onPause()中放入任何逻辑。即使可以,我也必须区分系统警报/覆盖和用户按下“后退” /“主页”按钮。
我还有其他方法可以做到这一点吗?
我正在使用Android 2.3.3开发飞思卡尔i.mx53主板,我正在尝试将自己的android本机服务添加到init.rc中,以便它在启动时运行.我已经尝试按照http://www.androidenea.com/2009/08/init-process-and-initrc.html上的指南,包括他们的示例服务代码.但是,我正在使用android ndk将示例服务代码构建为ARM二进制文件.
如果我在adb shell中手动运行示例服务.但是,当我把它放在src/system/core/rootdir/init.rc的末尾时,似乎没有任何事情发生.
我在启动后查看设备根目录中的init.rc,它与源中的init.rc不同.值得注意的是,我添加的行不在那里.
可能有什么不对?
我有一个名为 Main 的 Android Activity,它调用一个名为 MainService 的服务,如下所示:
Intent intent = new Intent(this, MainService.class);
if(MainService.getInstance() == null){
Log.d(TAG, "Calling MainService");
startService(intent);
}
Run Code Online (Sandbox Code Playgroud)
MainService 在其生命周期内维护一个变量,我希望稍后在 Main 中访问该变量。我该怎么做呢?
谢谢。