Android:7.0 후 암호 화 라 이브 러 리 Crypto 가 폐 기 된 후 구덩이 에 오 르 는 안내

10587 단어 Android
[전재 출처 밝 혀 주세요]필자:DrkCore(http://blog.csdn.net/DrkCore)원본 링크:(http://blog.csdn.net/drkcore/article/details/69931654)
문제 설명
필 자 는 가끔 자신의 작은 응용 프로그램 을 쓰 는데 그 중에서 하나의 기능 은 바로 구 궁 격 응용 자물쇠 이다.일반적으로 우 리 는 숫자 로 구 궁 격 의 잠 금 해제 순 서 를 표시 하고 이 순 서 를 문자열 로 구성 하여 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

좋은 웹페이지 즐겨찾기