2017-09-24 1 views
0

그래서, NIST을 사용하여 안드로이드 전화에 데이터베이스를 제공하여 악의적 인 애플리케이션을 탐지합니다. 주요 소스/데이터베이스는 다음과 같이보고한다 :Android - 설치된 앱 서명 목록을 확인하십시오

"SHA-1","MD5","CRC32","FileName","FileSize","ProductCode","OpSystemCode","SpecialCode" 
"0000000F8527DCCAB6642252BBCFA1B8072D33EE","68CE322D8A896B6E4E7E3F18339EC85C","E39149E4","Blended_Coolers_Vanilla_NL.png",30439,28948,"358","" 
"00000091728653B7D55DF30BFAFE86C52F2F4A59","81AE5D302A0E6D33182CB69ED791181C","5594C3B0","ic_menu_notifications.png",366,31287,"358","" 
"0000065F1900120613745CC5E25A57C84624DC2B","AEB7C147EF7B7CEE91807B500A378BA4","24400952","points_program_fragment.xml",1684,31743,"358","" 

먼저 열을 볼 수있는 특정 응용 프로그램의 SHA1 해시 코드입니다. 궁극적 인 목표는 에 설치된 모든 앱 서명 (예 : SHA1 해시 코드)을 데이터베이스와 비교하고 어떤 앱이 유해한 지 확인하는 것입니다.

인터넷 검색에 약간의 시간을 할애합니다. 내 자신의 응용 프로그램에 대한 해결책을 생각해 냈습니다 : https://gist.github.com/scottyab/b849701972d57cf9562e 그러나 이것은 의 앱 SHA1 해시 코드만을 반환합니다.

예를 들어,이 방법으로 나는 모든 응용 프로그램 패키지 이름을 얻을 수 있습니다 :

List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); 

어쩌면 가능성이 설치된 모든 애플리케이션 서명을 거기에 도착하는 것입니다? 알려줘.

+0

"궁극적 인 목표는 설치된 모든 앱 서명 (예 : SHA1 해시 코드)을 얻는 것입니다. NIST 데이터베이스의 값은"서명 "이 아닙니다. [NIST 설명서] (https://www.nist.gov/software-quality-group/nsrl-introduction)에 따라 "파일 내용의 암호화 해시 값 (MD5 및 SHA-1)"입니다. "나는 내 자신의 앱을위한 해결책을 찾았다"-이 코드는 SHA-1 해시를 공개 서명 키용으로 생성하고 SHA-1 해시는 생성하지 않습니다. – CommonsWare

+0

설명해 주셔서 감사합니다. 그래서 파일의 내용을 SHA1 해시 코드로 가져 와서 NIST 데이터베이스와 비교할 수 있습니까? – Locky

답변

0

당신은 다음과 같이 수행해야합니다

void printSampleSha1List(Context ctx) { 

    List<ApplicationInfo> packages = ctx.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA); 
    for (int i = 0; i < packages.size(); ++i) { 
     PackageInfo packageInfo = null; 
     try { 
      packageInfo = ctx.getPackageManager().getPackageInfo(
        packages.get(i).packageName, PackageManager.GET_SIGNATURES); 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 
     if (packageInfo != null) { 
      for (Signature signature : packageInfo.signatures) { 
       // SHA1 the signature 
       String sha1 = getSHA1(signature.toByteArray()); 

       Log.i("Sha1", "name:" + packages.get(i).packageName + ", " + sha1); 
       //note sample just checks the first signature 
       break; 
      } 
     } 
    } 

} 

public static String getSHA1(byte[] sig) { 
    MessageDigest digest = null; 
    try { 
     digest = MessageDigest.getInstance("SHA1", "BC"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchProviderException e) { 
     e.printStackTrace(); 
    } 
    digest.update(sig); 
    byte[] hashtext = digest.digest(); 
    return bytesToHex(hashtext); 
} 

//util method to convert byte array to hex string 
public static String bytesToHex(byte[] bytes) { 
    final char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', 
      '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
    char[] hexChars = new char[bytes.length * 2]; 
    int v; 
    for (int j = 0; j < bytes.length; j++) { 
     v = bytes[j] & 0xFF; 
     hexChars[j * 2] = hexArray[v >>> 4]; 
     hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
    } 
    return new String(hexChars); 
} 

이 당신에게 장치의 모든 패킷의 서명 SHA1의 목록을 제공합니다.

+0

그 코드는 앱의 SHA-1 해시가 아닌 공개 서명 키에 대해 SHA-1 해시를 생성합니다. – CommonsWare

+0

@CommonsWare 당신은 맞습니다. –

+0

@CommonsWare 그래서 앱의 SHA-1 해시를 얻을 기회가 있습니까? – Locky

관련 문제