암호화된 로컬 저장소

EncryptedLocalStore(ELS) 클래스는 응용 프로그램의 개인 데이터에 대한 작은 캐시로 사용할 수 있는 암호화된 로컬 저장소 메커니즘을 제공합니다. ELS 데이터는 응용 프로그램 간에 공유할 수 없습니다. ELS는 응용 프로그램에서 로그인 자격 증명 및 다른 개인 정보 같은 쉽게 재생성되는 항목을 저장할 수 있도록 하기 위한 것입니다. ELS 데이터는 "암호화된 로컬 저장소의 제한 사항"과 아래 "유용한 방법"에 설명된 것처럼 영구적인 것으로 간주해서는 안 됩니다.

참고: AIR은 암호화된 로컬 저장소 외에도 SQL 데이터베이스에 저장된 내용에 대한 암호화 기능도 제공합니다. 자세한 내용은 SQL 데이터베이스에서 암호화 사용 을 참조하십시오.

암호화된 로컬 저장소를 사용하여 웹 서비스에 대한 로그인 자격 증명과 같은 보호해야 하는 정보를 캐시할 수 있습니다. ELS는 다른 사용자에게 비공개로 유지해야 하는 정보를 저장하는 데 적합합니다. 그러나 ELS가 동일한 사용자 계정의 다른 프로세스 실행으로부터 데이터를 보호하는 것은 아닙니다. 따라서 DRM이나 암호화 키 같은 기밀 응용 프로그램 데이터를 보호하는 데는 적합하지 않습니다.

데스크톱 플랫폼에서 AIR는 DPAPI(Windows), KeyChain(Mac OS 및 iOS), KeyRing 또는 KWallet(Linux)을 사용하여 암호화된 로컬 저장소를 각 응용 프로그램 및 사용자와 연결합니다. 암호화된 로컬 저장소는 AES-CBC 128비트 암호화를 사용합니다.

Android에서 EncryptedLocalStorage 클래스가 저장하는 데이터는 암호화되지 않습니다. 대신 운영 체제에서 제공하는 사용자 수준 보안으로 데이터가 보호됩니다. Android 운영 체제는 모든 응용 프로그램에 별도의 사용자 ID를 할당합니다. 응용 프로그램은 해당 응용 프로그램 고유의 파일 및 공용 위치(예: 이동식 저장소 카드)에 만들어진 파일만 액세스할 수 있습니다. “루트로 지정된” Android 장치에서 루트 권한으로 실행 중인 응용 프로그램은 다른 응용 프로그램의 파일에 액세스할 수 있습니다. 따라서 루트로 지정된 장치에서 암호화된 로컬 저장소는 루트로 지정되지 않은 장치에서와 같은 높은 수준의 데이터 보호를 제공하지 않습니다.

암호화된 로컬 저장소의 정보는 응용 프로그램 보안 샌드박스의 AIR 응용 프로그램 내용에만 사용할 수 있습니다.

AIR 응용 프로그램을 업데이트할 경우 업데이트된 버전은 암호화된 로컬 저장소의 기존 데이터에 계속해서 액세스할 수 있습니다. 단, 다음 경우는 예외입니다.

  • stronglyBound 매개 변수를 true 로 설정한 상태로 항목을 추가한 경우

  • 기존 버전과 업데이트 버전이 모두 AIR 1.5.3 이전에 게시되었고 업데이트가 마이그레이션 서명으로 서명된 경우.

암호화된 로컬 저장소의 한계

암호화된 로컬 저장소의 데이터는 사용자의 운영 체제 계정 자격 증명으로 보호됩니다. 해당 사용자로 로그인하지 않는 한은 저장소의 데이터에 액세스할 수 없는 것입니다. 하지만 인증받은 사용자가 실행하는 다른 응용 프로그램의 데이터 액세스까지 차단할 수는 없습니다.

이러한 데이터 액세스가 가능하려면 사용자 인증을 거쳐야 하기 때문에 사용자 계정이 직접 손상되지 않는 한 해당 사용자의 개인 데이터는 계속 보호됩니다. 단, DRM(디지털 권한 관리) 또는 라이센스에 사용되는 키처럼 다른 사용자의 무단 액세스로부터 보호되어야 하는 응용 프로그램 데이터는 안전하지 않습니다. 따라서 그와 같은 정보는 ELS에 저장하지 않는 것이 좋습니다. 그저 암호와 같이 사용자의 개인 데이터를 저장하기에 적합한 장소일 뿐입니다.

ELS의 데이터는 여러 가지 이유로 손실될 수 있습니다. 예를 들어 사용자가 응용 프로그램을 제거하거나 암호화된 파일을 삭제할 수 있습니다. 또는 업데이트 결과 게시자 ID가 변경될 수도 있습니다. 따라서 ELS는 영구적인 데이터 저장소가 아니라 개인 캐시로 간주되어야 합니다.

stronglyBound 매개 변수는더 이상 사용되지 않으므로 true 로 설정해서는 안 됩니다. 이 매개 변수를 true 로 설정해도 추가적인 데이터 보호 효과는 없습니다. 또한 게시자 ID가 변하지 않아도 응용 프로그램이 업데이트될 때마다 데이터 액세스 권한이 사라집니다.

암호화된 로컬 저장소는 저장된 데이터가 10MB를 초과할 경우 속도가 느려질 수 있습니다.

AIR 응용 프로그램을 제거해도 암호화된 로컬 저장소에 저장된 데이터가 삭제되지는 않습니다.

유용한 방법

ELS는 다음과 같이 활용하는 것이 바람직합니다.

  • 암호 같은 민감한 사용자 데이터를 저장하는 데 사용합니다. 이때 stronglyBound를 false로 설정합니다.

  • DRM 키나 라이센싱 토큰 같은 응용 프로그램 기밀 데이터를 저장하는 데 사용하지 마십시오.

  • ELS 데이터가 손실될 경우 응용 프로그램에서 ELS에 저장된 데이터를 다시 만들 수 있는 방법을 제공합니다. 예를 들어 필요한 경우 사용자에게 계정 자격 증명을 다시 입력하라는 메시지를 표시합니다.

  • stronglyBound 매개 변수를 사용하지 않습니다.

  • stronglyBound true 로 설정하더라도 저장된 항목은 업데이트 중에 마이그레이션되지 않습니다. 대신 업데이트 후 데이터를 다시 만듭니다.

  • 상대적으로 적은 양의 데이터만 저장합니다. 많은 양의 데이터에는 암호화가 적용되는 AIR SQL 데이터베이스를 사용하십시오.

암호화된 로컬 저장소에 데이터 추가

EncryptedLocalStore 클래스의 setItem() 정적 메서드를 사용하여 로컬 저장소에 데이터를 저장할 수 있습니다. 데이터는 문자열을 키로 사용하여 바이트 배열로 해시 테이블에 저장됩니다.

예를 들어, 다음 코드에서는 암호화된 로컬 저장소에 문자열을 저장합니다.

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes);

setItem() 메서드의 세 번째 매개 변수인 stronglyBound 매개 변수는 선택 사항입니다. 이 매개 변수가 true 로 설정되면 다음과 같이 암호화된 로컬 저장소가 저장된 항목을, 저장하는 AIR 응용 프로그램의 디지털 서명 및 비트에 바인딩합니다.

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes, false); 

stronglyBound true 로 설정하여 저장된 항목의 경우 이후의 getItem() 호출은 호출하는 AIR 응용 프로그램이 저장하는 응용 프로그램과 동일한 경우에만 성공합니다(응용 프로그램 디렉토리에 있는 파일의 데이터가 변경되지 않은 경우). 호출하는 AIR 응용 프로그램이 저장하는 응용 프로그램과 다른 경우 강력하게 바인딩된 항목에 대해 getItem() 을 호출하면 응용 프로그램에서 Error 예외를 발생시킵니다. 응용 프로그램을 업데이트하는 경우 해당 응용 프로그램에서는 암호화된 로컬 저장소에 이전에 작성한 강력하게 바인딩된 데이터를 읽을 수 없습니다. 모바일 장치에서 stronglyBound true 로 설정해도 무시됩니다. 이 매개 변수는 항상 false 로 처리됩니다.

stronglyBound 매개 변수를 false (기본값)로 설정할 경우 제작자 ID만 동일하면 응용 프로그램이 데이터를 읽을 수 있습니다. 응용 프로그램의 비트는 변경될 수 있으며(동일한 제작자로 서명되어야 함) 데이터를 저장한 응용 프로그램의 비트와 정확히 동일해야 하는 것은 아닙니다. 원래 ID와 동일한 제작자 ID를 사용하여 업데이트된 응용 프로그램은 데이터에 계속 액세스할 수 있습니다.

참고: 실제로, stronglyBound true 로 설정하더라도 데이터 보호가 강화되지는 않습니다. "악의적인" 사용자가 여전히 응용 프로그램을 변경하여 ELS에 저장된 항목에 액세스할 수 있습니다. 뿐만 아니라, stronglyBound true 로 설정되어 있든 false 로 설정되어 있든 데이터는 외부의 비사용자 위협으로부터 마찬가지 수준으로 보호됩니다. 따라서 stronglyBound true 로 설정하는 것은 권장되지 않습니다.

암호화된 로컬 저장소에서 데이터 액세스

다음 예제와 같이 EncryptedLocalStore.getItem() 메서드를 사용하여 암호화된 로컬 저장소에서 값을 가져올 수 있습니다.

var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); 
trace(storedValue.readUTFBytes(storedValue.length)); // "Bob" 

암호화된 로컬 저장소에서 데이터 제거

다음 예제와 같이 EncryptedLocalStore.removeItem() 메서드를 사용하여 암호화된 로컬 저장소에서 값을 삭제할 수 있습니다.

EncryptedLocalStore.removeItem("firstName"); 

다음 예제와 같이 EncryptedLocalStore.reset() 메서드를 호출하여 암호화된 로컬 저장소에서 모든 데이터를 지울 수 있습니다.

EncryptedLocalStore.reset();