Android:7.0 후 암호 화 라 이브 러 리 Crypto 가 폐 기 된 후 구덩이 에 오 르 는 안내
10587 단어 Android
문제 설명
필 자 는 가끔 자신의 작은 응용 프로그램 을 쓰 는데 그 중에서 하나의 기능 은 바로 구 궁 격 응용 자물쇠 이다.일반적으로 우 리 는 숫자 로 구 궁 격 의 잠 금 해제 순 서 를 표시 하고 이 순 서 를 문자열 로 구성 하여 Shared Preferences 에 암호 화 합 니 다.필자 가 프로젝트 의 targetSdkVersion 을 25 로 설정 한 후에 프로그램 이 무 너 질 때 까지 모든 것 이 정상 입 니 다.
********** PLEASE READ ************
*
* New versions of the Android SDK no longer support the Crypto provider.
* If your app was relying on setSeed() to derive keys from strings, you
* should switch to using SecretKeySpec to load raw key bytes directly OR
* use a real key derivation function (KDF). See advice here :
*
http://android-developers.blogspot.com/2016/06/security-crypto-provider-deprecated-in.html
***********************************
암호 화 알고리즘 은 모두 키 가 필요 하 다 는 것 을 알 고 있 습 니 다.예 를 들 어 AES 알고리즘 은 128 비트,192 비트,256 비트 세 가지 길이 의 키 를 지원 합 니 다.보통 이 키 들 은 코드 에 명시 되 거나 KeyStore 파일 로 기 록 됩 니 다.이 키 를 직접 사용 하 는 것 은 문제 가 되 지 않 지만 문자열 형식의 비밀 번 호 를 통 해 키 를 만들어 야 할 때 가 있 습 니 다.
검색엔진 에서 찾 아 온 방법 에 따라 다음 과 같은 코드 를 쓰 고 필자 와 같은 문 제 를 만 날 수 있 습 니 다.
public static final String DEPREACATED_SECURE_ALGORITHM_SHA1PRNG = "SHA1PRNG";
public static final String DEPREACATED_SECURE_PROVIDER_CRYPTO = "Crypto";
/**
* key。
*
* @param password
* @param charset
* @param keyBitLen
* @return
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
*/
@Deprecated
public static byte[] deriveKeyDeprecated(String password, @Nullable Charset charset, int keyBitLen) throws NoSuchProviderException, NoSuchAlgorithmException {
SecureRandom secureRandom = SecureRandom.getInstance(DEPREACATED_SECURE_ALGORITHM_SHA1PRNG, DEPREACATED_SECURE_PROVIDER_CRYPTO);
// key,
secureRandom.setSeed(password.getBytes(charset != null ? charset : Charset.defaultCharset()));
KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
keyGenerator.init(keyBitLen, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
return secretKey.getEncoded();
}
무 작위 생 성기 의 피 드 로 비밀 번 호 를 키 키 키 로 환산 하 는 것 을 볼 수 있 습 니 다.이 방법 은 안전 하지 않 은 것 으로 인정 되 었 습 니 다.공식 개발 자 들 은 악 스 드 로 이 드 N 에서 관련 크 립 토 provider 와 SHA1PRNG 알고리즘 을 동시에 폐기 하고 후속 SDK 에서 관련 라 이브 러 리 를 완전히 제거 할 계획 이다.
물론 이 문 제 를 돌 리 려 면 키 를 직접 사용 하거나 targetSdkVersion 을 낮 춰 서 붕 괴 를 감 출 수 있 지만 이 구 덩이 는 조만간 채 워 야 합 니 다.그 러 니까 이 문 제 를 어떻게 해결 해 야 하 는 지 보 자.
해결 방안
Android-Developers-Blogspot: security-crypto-provider-deprecated-in
해결 방안 은 주로 위의 관계자 들 이 이상 로그 에서 제시 한 링크(과학적 인 인터넷 이 필요 함)에서 나 왔 다.필 자 는 핵심 적 인 논리 와 설명 을 정리 하 는 것 일 뿐이다.다음은 이 문 제 를 해결 하 는 핵심 코드 입 니 다.
//
String password = "password";
// ,
// AES 128、192 256
int keyLength = 256;
// ,
//
// 256 , 256/8 = 32
// 32
int saltLength = 32;
byte[] salt;
//
//
//
// ,
SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
// 、
int iterationCount = 1000;
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt,
iterationCount, keyLength);
SecretKeyFactory keyFactory = SecretKeyFactory
.getInstance("PBKDF2WithHmacSHA1");
//
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");
이상 은 문자열 에서 키 를 정확하게 가 져 오 는 방법 입 니 다.공식 적 으로 는 폐 기 된 논리 로 암호 화 된 데 이 터 를 보조 적 으로 복호화 할 수 있 는 도구 류 가 포함 되 어 있 으 며 필요 한 친구 가 스스로 가 져 갈 수 있 습 니 다(과학 인터넷 이 필요 합 니 다).
Samples:BrokenKeyDerivation
물론 필자 가 이 구덩이 에서 어떻게 기어 나 왔 는 지 볼 수 있 고 제 GitHub 프로젝트 의 일부 소스 코드 도 참조 할 수 있 습 니 다.
CoreMate: AESEncryptor
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.