android6.0 一个pin码设置-加密-存储 跟踪。其实6.0跟7.0的都差不多,差别在于java通过binder底层的时候,6.0的是c代码写的,而7.0的是用c++同名文件写的(keystore.c/keystore.cpp)。这个在7.0还是比较多见,包括 在system/core下面的init.c,在7.0的后都改成init.cpp.
该密码保存在/data/misc/keystore/user_0/.masterkey ,可以在adb shell之后, ls -al /data/misc/keystore/user_0/.masterkey。
在分别在看设置pin码,和删除pin码的情况下是否存在该文件 。
下面讲下,怎么从设置点击 安全-屏幕锁定方式 设定pin -设置pin码两遍- 通知 - 完成 到一直怎么pin怎么加密和存储。
完成这个button是一个设置中通用的一个按键,不在通知界面的布局中。
1.这个按键响应的ChooseLockPassword.java onClick方法,执行
case R.id.next_button:
handleNext();
进到了handleNext方法,在handleNext方法中有对两次pin进行verity在第二次输入密码和第一次密码一致时候执行saveLockPassword。
if (mFirstPin.equals(pin)) {
...
mLockPatternUtils.saveLockPassword(pin, mCurrentPassword, mRequestedQuality,
isFallback, isFallbackFor, UserHandle.myUserId());
...
2. 进到了 LockPatternUtils.java来报存密码
saveLockPassword中会做一次密码检查是否有空或是否是4位,pin只能是四位,在传pin password,类型,userHandle下去
if (password == null || password.length() < MIN_LOCK_PASSWORD_SIZE) {
throw new IllegalArgumentException("password must not be null and at least "
+ "of length " + MIN_LOCK_PASSWORD_SIZE);
}
getLockSettings().setLockPassword(password, savedPassword, userHandle);
private ILockSettings getLockSettings() {
if (mLockSettingsService == null) {
ILockSettings service = ILockSettings.Stub.asInterface(
ServiceManager.getService("lock_settings"));
mLockSettingsService = service;
}
return mLockSettingsService;
}
3.通过AIDL,调用的是 LockSettingsService.java service端的setLockPassword方法,
byte[] enrolledHandle = enrollCredential(currentHandle, savedCredential, password, userId);
if (enrolledHandle != null) {
mStorage.writePasswordHash(enrolledHandle, userId);
} else {
Slog.e(TAG, "Failed to enroll password");
}
在做writePasswordHash之前,有执行enrollCredential
GateKeeperService
下次继续。。。