로컬 스토리지를 안전한 것으로 간주 할 수 있습니까? [닫은]


161

오랫동안 오프라인으로 작동하는 웹 응용 프로그램을 개발해야합니다. 이것을 가능하게하기 위해 민감한 데이터 (개인 데이터는 저장하지만 해시 만 저장하는 데이터는 저장하지 않음)를 로컬 저장소에 저장하는 것을 피할 수 없습니다.

이 방법은 권장되지 않지만 선택의 여지가 거의 없으므로 데이터를 보호하기 위해 다음을 수행하고 있습니다.

  • 스탠포드 자바 스크립트 암호화 라이브러리 및 AES-256을 사용하여 로컬 스토리지에 들어가는 모든 것을 gentrypting
  • 사용자 비밀번호는 암호화 키이며 장치에 저장되지 않습니다
  • SSL을 통해 신뢰할 수있는 단일 서버에서 모든 컨텐츠 (온라인 상태) 제공
  • owasp antisamy 프로젝트를 사용하여 서버의 로컬 저장소로 들어오고 나가는 모든 데이터의 유효성 검사
  • appcache의 네트워크 섹션에서 *를 사용하지 않고 대신 신뢰할 수있는 서버와의 연결에 필요한 URI 만 나열합니다.
  • 일반적으로 OWASP XSS 치트 시트에 제안 된 지침을 적용하려고합니다.

나는 악마가 종종 자세하게 설명하고 로컬 스토리지와 자바 스크립트 기반 보안에 대해 많은 회의론이 있다는 것을 알고 있습니다. 누구든지 다음에 대해 의견을 말할 수 있습니까?

  • 위의 접근 방식의 근본적인 결함?
  • 그러한 결함에 대한 가능한 해결책은 무엇입니까?
  • html 5 애플리케이션이 장기간 오프라인으로 작동해야 할 때 로컬 스토리지를 보호하는 더 좋은 방법은 무엇입니까?

도움을 주셔서 감사합니다.


"권장하지 않는 것이 좋습니다" -그렇습니까? 그것을 위해 실제로 만들어진 것과 반대가 아닌가?
hakre

2
명확히하기 위해 민감한 데이터를 로컬 저장소에 저장하는 방법을 권장하지 않았습니다 .
user1173706

그렇게 큰 네트워크를 통해 민감한 데이터를 전달해서는 안 됩니까?
hakre

@ user1173706 왜 응용 프로그램이 작동해야하는 이유는 오랜 시간 동안 오프라인 상태입니까? 사용자는 어떤가요? 어떤 브라우저를 지원해야합니까? 나는 그것이 가능하다고 생각하지만 시나리오 에 대한 세부 사항을 알아야 합니다 .
Benjamin Gruenbaum 2016 년

@ Benjamin 질문을 업데이트했습니다. 감사.
user1173706

답변:


74

Web 크립토

클라이언트 측 (브라우저) 자바 스크립트의 암호화 관련 문제는 아래에 자세히 설명되어 있습니다. 이러한 우려 중 하나를 제외한 모든 것이 WebCrypto API 에는 적용되지 않으며 , 이는 현재 합리적으로 잘 지원됩니다 .

오프라인 앱의 경우 여전히 보안 키 저장소를 디자인하고 구현해야합니다.

따로 : Node.js를 사용하는 경우 기본 제공 암호화 API를 사용하십시오 .

네이티브 자바 스크립트 암호화 (WebCrypto 이전)

본인의 주된 관심사는 localStorage귀하의 사이트에 대한 컴퓨터를 물리적으로 액세스 할 수있는 사람 이고 해당 액세스를 막기 위해 암호화를 원한다고 가정합니다.

누군가가 물리적으로 접근 할 수있는 경우 다른 것보다 더 공격 할 수 있으며 읽기보다는 열악합니다. 여기에는 키로거, 오프라인 스크립트 수정, 로컬 스크립트 삽입, 브라우저 캐시 포이즈 닝 및 DNS 리디렉션이 포함되지만 이에 국한되지는 않습니다. 이러한 공격은 사용자가 손상된 시스템을 사용하는 경우에만 작동합니다. 그럼에도 불구하고 그러한 시나리오에서 물리적 액세스는 더 큰 문제가 있음을 의미합니다.

따라서 로컬 암호가 유용한 제한된 시나리오는 컴퓨터를 도난 당했을 경우입니다.

원하는 기능을 구현하는 라이브러리가 있습니다 (예 : Stanford Javascript Crypto Library) . 그러나 @ircmaxell의 답변 링크에서 언급 된 바와 같이 고유 한 약점이 있습니다.

  1. 엔트로피 부족 / 난수 생성;
  2. 보안 키 저장소가 부족합니다. 즉, 개인 키는 로컬로 저장하거나 서버에 저장 한 경우 (오프라인 액세스가 금지됨) 암호로 보호해야합니다.
  3. 안전한 지우기 부족;
  4. 타이밍 특성 부족.

이러한 각 취약점은 암호화 손상 범주에 해당합니다. 다시 말해, 이름에 따라 "암호화"가있을 수 있지만 실제로는 열악한 수준보다 훨씬 낮을 것입니다.

그러나 보험 계리 적 평가는 "자바 스크립트 암호화가 약하고 사용하지 마십시오"만큼 사소한 것은 아닙니다. 이것은 보증이 아니며 엄격히 경고하기 때문에 위의 약점의 노출, 직면하는 벡터의 빈도 및 비용, 실패한 경우 완화 또는 보험에 대한 귀하의 능력을 완전히 이해해야합니다 : Javascript crypto, in 약점에도 불구하고 노출을 줄일 수 있지만 기술 능력이 제한된 도둑에 대해서만 노출됩니다. 그러나 Javascript 암호화는 해당 정보를 대상으로하는 결정적이고 유능한 공격자에 대한 가치가 없다고 가정해야합니다. 일부는 구현에 고유 한 취약점이 너무 많을 때 데이터를 "암호화"하는 것이 잘못 될 수 있다고 생각합니다. 다시 말해, 기술 노출을 약간 줄일 수 있지만 공개로 인한 재무 노출을 증가시킵니다. 물론 각 상황은 다르며, 재정적 노출에 대한 기술적 노출을 줄이는 분석은 쉽지 않습니다. 여기에 비유가 있습니다 :일부 은행 은 고유 한 위험에도 불구하고 약한 암호를 요구합니다. 약한 암호 로 인한 손실에 대한 노출은 강력한 암호를 지원하는 최종 사용자 비용보다 적기 때문입니다.

🔥 마지막 단락을 읽고 "Brian이라는 인터넷상의 일부 사람이 Javascript 암호화를 사용할 수 있다고 말합니다"라고 생각되면 Javascript 암호화를 사용하지 마십시오.

질문에 설명 된 유스 케이스의 경우 사용자가 로컬 파티션 또는 홈 디렉토리를 암호화하고 강력한 비밀번호를 사용하는 것이 더 합리적입니다. 이러한 유형의 보안은 일반적으로 잘 테스트되고 널리 신뢰되며 일반적으로 사용 가능합니다.


2011 년부터 NCC 그룹에서 제공 한 "JavaScript 암호화 사용 안 함"의 일반적인 자세에 대한 추가 문서 (인용)가 있습니다. JavaScript 암호화가 유해한 것으로 간주 됨 (특히 다운로드를 확인하기 위해 도구를 다운로드 한 경우 22 번) PRNG 품질 … 등)
amcgregor

58

글쎄, 여기의 기본 전제는 : 아니요, 아직 안전하지 않습니다.

기본적으로 JavaScript에서는 암호화를 실행할 수 없습니다 : JavaScript CryptoConceptor Harmful .

문제는 브라우저에 암호화 코드를 안정적으로 가져올 수 없으며, 가능하더라도 JS가 안전하게 실행할 수 있도록 설계되지 않았다는 것입니다. 따라서 브라우저에 암호화 컨테이너 (암호화 된 미디어 확장 프로그램이 제공하지만 DRM 목적으로 룰이 적용되는)가있을 때까지 안전하게 수행 할 수 없습니다.

"더 나은 방법"에 관해서는 지금 당장은 없습니다. 유일한 대안은 데이터를 일반 텍스트로 저장하고 최선을 다하는 것입니다. 또는 정보를 전혀 저장하지 마십시오. 어느 쪽이든.

당신이 경우 어느 즉, 또는 필요한 보안의 종류, 당신은 로컬 스토리지를 필요로하는 사용자 지정 응용 프로그램을 만들 ...


8
Downvoter : 더 나은 답변을 제공 할 수 있습니까? 나는 이것이 보안 전문가들과 비전문가들 사이에 상당한 의견 불일치가있는 다소 논란의 여지가있는 문제라는 것을 알고, 다른 관점은 공유 할 가치가있을 것이다. 다른 이유로 하향 투표를하지 않는 한 어떻게하면이 답변을 개선 할 수 있습니까?
ircmaxell

9
@ircmaxell은 아니지만이 답변에 동의하지 않습니다. "문제는 브라우저에 암호화 코드를 안정적으로 가져올 수 없으며, 가능하더라도 JS가 안전하게 실행할 수 있도록 설계되지 않았다는 것입니다." - 왜? 본질적인 문제 는 무엇입니까 ? Stanford JavaScript 암호화 라이브러리를 사용하여 암호화 / 암호 해독 할 수 있습니다. 해시 할 수 있으며 모든 것을 안전하게 수행 할 수 있습니다. JS의 오프라인 앱에서 다른 언어로 빌드 된 앱과 마찬가지로 표준 크립토를 수행하는 고유 한 문제는 여기에서 볼 수 없습니다.
Benjamin Gruenbaum

11
@ BenjaminGruenbaum : 문제는 암호 코드가 타사 코드와 상호 작용 해야하는 곳이 여러 곳 있다는 것입니다. 내가 링크 한 기사의 요점은 실행 환경을 제어 할 수 없다는 것입니다. 따라서 Stanford Crypto lib를 설치하십시오. 그런 다음 일부 브라우저 플러그인 sjcl.encrypt이 키를 이메일로 이메일을 보내도록 무시하면 어떻게됩니까 ? JS에서는 100 % 가능하며이를 막을 수있는 방법이 없습니다. 이것이 바로 기본 요점입니다. 다른 JS가 데이터에 대해 불쾌한 작업을 수행하지 못하도록하는 "보안"메커니즘은 없습니다. 그리고 그것은 문제 입니다.
ircmaxell

13
@ircmaxell 당신이 개와 함께 자면 벼룩으로 깨어날 것이라고 기대할 수 없습니다. 사용자가 맬웨어 추가 프로그램을 설치하는 경우 PC에 바이러스를 설치하는 사용자와 동일하지만 다른 것과 다릅니다. Java 또는 C 프로그램은 가능한 한 안전 할 수 있지만 공격자가 조이는 코드를 실행할 수있는 즉시 가능합니다. JS와 다르지 않습니다. 애드온은 브라우저에 마술처럼 나타나지 않습니다. 또한 암호화 된 정보를 저장하지 않으면 사용자가 멀웨어를 가지고있는 경우 데이터를 가로 채기 만하면 도움이되지 않습니다.
Benjamin Gruenbaum

9
@BenjaminGruenbaum : 동의하지 않습니다. 일반 응용 프로그램에서는 필요한 것 중 하나 (메모리 위치를 읽을) 응용 프로그램 자체를 손상하거나 상자에 이득 루트 액세스 (운영 체제를 손상). 어느 쪽이든, 당신은 단지 정상적인 행동보다 더 깊은 것을 타협해야합니다. JS는 정상적인 동작으로 이것을 허용합니다. 문제는 ...
ircmaxell

12

이 주제를 탐색하면서 "웹 암호화 API를 사용하여 TodoMVC 보안"이라는 제목의 프레젠테이션이 있습니다 ( video , code ).

그것은 사용하는 웹 암호화 API 암호 응용 프로그램을 보호하고 암호화를위한 암호 파생 키를 사용하여 로컬 스토리지에서 암호화 된 일 목록을 저장합니다. 비밀번호를 잊어 버린 경우 복구가 없습니다. ( 면책 조항-POC였으며 프로덕션 용도로 사용되지 않았습니다. )

다른 답변에서 알 수 있듯이 이것은 여전히 ​​클라이언트 컴퓨터에 설치된 XSS 또는 맬웨어에 영향을 받기 쉽습니다. 그러나 데이터가 서버에 저장되고 응용 프로그램이 사용 중일 때 중요한 데이터도 메모리에 저장됩니다. 오프라인 지원이 매력적인 유스 케이스 일 수 있습니다.

결국 localStorage를 암호화하면 시스템 또는 백업에 대한 읽기 전용 액세스 권한을 가진 공격자로부터 데이터 만 보호 할 수 있습니다. OWASP Top 10 항목 A6- 민감한 데이터 노출에 대해 약간의 방어 수준을 추가하고 "이 데이터 중 어느 것이 일반 텍스트로 저장되어 있습니까?" 바르게.


3

이것은 정말로 흥미로운 기사입니다. 로컬 저장소를 사용할 때 보안을 제공하기 위해 JS 암호화를 구현하려고합니다. 장치를 도난 당하고 올바르게 구현 된 경우에만 보호 기능을 제공 할 것입니다. 키로거 등에 대한 보호 기능을 제공하지는 않습니다. 그러나 키로거 위협은 실행 플랫폼 (브라우저, 기본)에 관계없이 모든 응용 프로그램의 문제이므로 JS 문제는 아닙니다. 첫 번째 답변에서 언급 된 "자바 스크립트 암호화로 인한 유해성"기사에 대해 한 가지 비판이 있습니다. "이 문제를 해결하기 위해 SSL / TLS를 사용할 수 있지만 비용이 많이 들고 복잡합니다"라고 표시되어 있습니다. 나는 이것이 매우 야심 찬 주장이라고 생각한다. 예, SSL에는 비용이 있습니다.

내 결론-클라이언트 측 암호화 코드를위한 장소가 있지만 모든 응용 프로그램과 마찬가지로 개발자는 코드의 한계를 인식하고 필요에 따라 구현해야하며 위험을 완화시킬 수있는 방법이 있어야합니다.


역사적으로 초기 연결 협상과 관련하여 특별한 비용 (기계적, 재정적 아님)이있었습니다. 기업이 전용 SSL 종료 어플라이언스를 사용한다는 점까지는 인증서 발급 및 보증 비용을 넘어서 재정적으로 비용이 많이들 수 있습니다. 현재 후속 요청에서 초기 핸드 셰이크를 피하기 위해 연장 된 세션 지속성과 같은 많은 문제가 해결되었습니다.
amcgregor

2

모든 웹 페이지에는 액세스 할 수 없지만 (true) 크롬 (ctl-shift-J)과 같은 개발 도구를 통해 쉽게 액세스하고 편집 할 수 있습니다. 따라서 값을 저장하기 전에 사용자 지정 암호화가 필요합니다.

그러나 자바 스크립트가 암호를 해독 (검증하기 위해)해야하는 경우 암호 해독 알고리즘이 노출되어 조작 될 수 있습니다.

Javascript에는 완전히 안전한 컨테이너와 js 인터프리터에서만 사용할 수있는 개인 변수 및 함수를 올바르게 구현할 수있는 기능이 필요합니다. 그러나 추적 데이터를 불완전하게 사용할 수 있기 때문에 이는 사용자 보안에 위배됩니다.

결과적으로 자바 스크립트는 완전히 안전하지 않습니다.


-29

아니.

localStorage는 모든 웹 페이지에서 액세스 할 수 있으며 키가 있으면 원하는 데이터를 변경할 수 있습니다.

즉, 키를 안전하게 암호화하는 방법을 고안 할 수 있다면 데이터를 전송하는 방법은 중요하지 않으며 클로저 내에 데이터를 포함 할 수 있으면 데이터가 안전합니다.


19
"모든 웹 페이지"에 액세스 할 수 없습니다. 현재 도메인의 페이지에만 액세스 할 수 있습니다.
dtabuenc

@dtabuenc 반대로, 나는 펜 a를했다 동안 다시 그 쇼 당신 당신의 로컬 스토리지에있는 모든 단일 키 / 값 쌍 어떤 해킹없이.
hellol11

3
아니! 죄송합니다. 로컬 스토리지는 도메인별로 분리되어 있습니다. 한 도메인에서 실행되는 코드는 다른 도메인에 의해 로컬 스토리지에 저장된 값에 액세스 할 수 없습니다. 예를 들어 google.com은 로컬 저장소에 많은 것을 저장합니다. 펜 예제에서 google.com의 키를 나열 할 수 없습니다.
dtabuenc

@dtabuenc가 그것을 테스트했습니다.
hellol11
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.