Android M 잠 금 화면 암호 저장 방식 깊이 이해

Android M 이전 잠 금 화면 비밀번호 저장
Android M 이전에 잠 금 화면 암 호 는 저장 형식 이 간단 합 니 다.64 비트 무 작위 수 를 salt 값 으로 사 용 했 습 니 다.이 salt 값 은 SQLite 데이터베이스/data/system/locksettings.db 에 저 장 됩 니 다.암 호 는 저장 할 때 입력 한 암 호 를 이 난수 에 더 해 새로운 문자열 을 만 듭 니 다.그 다음 에 새로운 문자열 을 각각 SHA-1 과 MD5 암호 화하 고 암호 화 된 밀 문 을 MD5+SHA-1 방식 으로 문자열 을 연결 하여 새로운 밀 문 을 구성 하여/data/system/password.key 에 저장 합 니 다.모두 72 비트 입 니 다.암호 화 된 형식 은 다음 과 같 습 니 다.

/data/system # cat password.keyB40C2F6FE4E89F3386D4E689B135304410D64951914FB35770FDAC58B694177B29297A80

암호 에 대한 자세 한 정 보 는/data/system/device 에 저 장 됩 니 다.policies.xml 에서 내용 은 다음 과 같 습 니 다.

/data/system # cat device_policies.xml

그 중에서 주로 사용 되 는 두 필드 품질 은 암호 의 유형 으로 간단 한 암호 와 복잡 한 암호 의 값 이 다 르 고 length 는 암호 의 길이 이 며 다른 필드 에 암호 에 저 장 된 여러 문자 의 수량 입 니 다.
Android M 의 잠 금 화면 암호 저장 소
Android M 에서 잠 금 화면 암호 의 저장 형식 이 바 뀌 었 습 니 다.기본 저장 형식 은/system/gatekeeper/include/gatekeeper/password 입 니 다.handle.h 에서 다음 과 같이 설명 합 니 다.

typedef uint64_t secure_id_t;typedef uint64_t salt_t;/** * structure for easy serialization * and deserialization of password handles. */static const uint8_t HANDLE_VERSION = 2;struct __attribute__ ((__packed__)) password_handle_t {  // fields included in signature  uint8_t version;  secure_id_t user_id;  uint64_t flags;  // fields not included in signature  salt_t salt;  uint8_t signature[32];  bool hardware_backed;};

그 중 version 은 기본적으로 2,userid 는 Android 사용자 id 이 고 signature 는 비밀문서 입 니 다.hardwarebacked 는 암호 화 방식 을 저장 하고 0 은 암호 화 된 문 서 를 소프트웨어 암호 화 라 고 표시 하 며 1 은 암호 화 된 문 서 를 TEE 환경 을 통 해 암호 화 된 것 임 을 나타 낸다.
암호 화 후 기본적으로 passwordhandle_t 형식 은/data/system/gatekeeper.password.key 에 저 장 됩 니 다.암호 생 성과 검증 은 HAL 층 에서 system/core/gatekeeperd/gatekeeperd.cpp 의 함 수 를 통 해 이 루어 집 니 다.시스템 이 시 작 될 때 gatekeeperd 서비스 로 등록 되 고 서비스 가 시 작 될 때 GateKeeperProxy()대상 을 호출 합 니 다.이러한 구조 함 수 는 TEE module 을 찾 고 찾 으 면 TEE 장 치 를 통 해 복호화 하고 찾 지 못 하면 소프트웨어 장 치 를 통 해 복호화 합 니 다.
여기 서 주로 연 갑 장 치 를 통 해 복호화 하 는 논 리 를 분석한다.복호화 할 때 시스템/core/gatekeeperd/gatekeeperd.cpp 의 다음 함수 로 호출 됩 니 다.

int verify(uint32_t uid, const uint8_t *enrolled_password_handle,      
uint32_t enrolled_password_handle_length,      
const uint8_t *provided_password, uint32_t provided_password_length,      
bool *request_reenroll)

이 함수 에 서 는 TEE 를 사용 하지 않 았 기 때문에 소프트웨어 장치 인증 시스템/core/gatekeeperd/softGateKeeperDevice.cpp 에 호출 됩 니 다.

int SoftGateKeeperDevice::verify(uint32_t uid,  
uint64_t challenge, const uint8_t *enrolled_password_handle,  
uint32_t enrolled_password_handle_length, const uint8_t *provided_password,  
uint32_t provided_password_length, uint8_t **auth_token, uint32_t *auth_token_length,  
bool *request_reenroll)

함수 검증,이 함 수 는 들 어 오 는 정 보 를 처리 한 후 시스템/gatekeeper/gatekeeper.cpp 에 전달 합 니 다.

void GateKeeper::Verify(const VerifyRequest &request, VerifyResponse *response)

처 리 를 하고 여기 서 매개 변 수 를 일련의 처리 와 재 구성 한 후에 맡 깁 니 다.

bool GateKeeper::DoVerify(const password_handle_t *expected_handle, const SizedBuffer &password)

이 함수 에서 다시 호출 합 니 다.

bool GateKeeper::CreatePasswordHandle(SizedBuffer *password_handle_buffer, salt_t salt,  
secure_id_t user_id, uint64_t flags, uint8_t handle_version, const uint8_t *password,  
uint32_t password_length)

위 에서 언급 한/data/system/gatekeeper.password.key
파일 에 저 장 된 정 보 를 분석 한 다음 호출 합 니 다.

ComputePasswordSignature(password_handle->signature, sizeof(password_handle->signature),      
password_key, password_key_length, to_sign, sizeof(to_sign), salt);

함 수 는 입력 한 암 호 를 암호 화 합 니 다.여기 서 볼 수 있 습 니 다.입력 한 암 호 를 암호 화 하려 면 저 장 된 암호 의 salt 값 만 사용 해 야 합 니 다.이 함 수 는 system/core/gatekeeperd/soft GateKeeper.h 에서 crypto 라 이브 러 리 에 있 는 것 을 호출 합 니 다.

crypto_scrypt(password, password_length, reinterpret_cast(&salt),    
sizeof(salt), N, r, p, signature, signature_length);

입력 한 암 호 를 signature 에 저장 하고 되 돌려 줍 니 다.이 함 수 는 최종 적 으로 SHA 256 을 통 해 암호 화 됩 니 다.매개 변수 중의 N,r,p 는 다음 과 같은 값 이 라 고 생각 합 니 다.

static const uint64_t N = 16384;static const uint32_t r = 8;static const uint32_t p = 1;

상기 처 리 를 통 해 입력 한 비밀 번 호 를 암호 화한 후 얻 은 비밀 번 호 를 휴대 전화 에 저 장 된 비밀 번 호 를 비교 한 후 검사 결 과 를 되 돌려 입력 한 비밀번호 의 정확 여 부 를 판단 한다.
안 드 로 이 드 M 에 서 는 기 존 에 자바 층 에서 직접 암호 검증 을 하 는 방식 을 바 꿔 암호 검증 을 HAL 층 의 서 비 스 를 통 해 처리 하 는 동시에 TEE 에 대한 지원 을 추가 함으로써 잠 금 화면 암호 의 안전성 을 크게 향상 시 키 는 동시에 다른 보안 기능 도 편리 하 게 지원 하여 전체 시스템 의 안전성 을 향상 시 켰 다.
안 드 로 이 드 M 잠 금 화면 비밀번호 저장 방식 이 여러분 에 게 공유 하 는 모든 내용 임 을 깊이 이해 합 니 다.참고 해 주시 고 많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기