프로그램에서 대칭키 알고리즘의 키는 어떻게 저장하고 사용하시나요?

dcmru의 이미지

제목과 같이 프로그램을 짤 때 대칭키 알고리즘을 사용하였다면, 키의 관리는 어떻게 저장하고 사용하시나요?

프로그램에서 파일을 암복호화해서 사용한다고 하였을 때 키의 값이 변하면 안되므로

어떻게든 저장을 하고 있어야 암호화 후 복호화할 때 같은 키를 사용할 수 있을 텐데요.

키생성에 Rand값을 사용해도 이는 1회용 밖에 되지 않을 것 같습니다.

그렇다고 키를 파일에 써놓고 사용을 해도 평문 키를 파일에 써놓으면 취약(?)하므로

이를 다시 암호화한다고 해도 키가 필요할 것이구요.

프로그램에 하드코딩하는 것도 어떻게든 취약할 것으로 생각이 됩니다.

키 자체를 프로그램이 실행되는 환경에서 유일한 값을 가져와서 사용한다고 해도

사용하는 값들은 유출이 될 수 있을 것 같습니다.

이론적으로 배운 방법들을 실제 프로그래밍에 적용할 때 약간의 괴리감이 있네요.

keystore 같은 것을 실제 사용하여 키관리를 하시나요?

어떤 방법들을 주로 사용하시나요?

ymir의 이미지

암호키는 적당히 네고하던가, 전송하는 쪽에서 임의 생성한 후에, 키 교환 프로토콜을 이용해서 공유합니다.
필요할 때마다 handshaking 해서 쓰면 되니, 저장할 필요가 없죠.

만약 PSK 같은 걸 쓴다면, shared secret 을 바로 키 생성에 쓰지 않고, 적당한 알고리즘을 돌린 후에 키 생성에 씁니다.
서버와 클라는 사전에 알고리즘을 미리 알고 있어야 하겠죠.
password 가 유출되더라도 어떤 알고리즘을 어떻게 돌려서 키 데이터로 가공했는지 알지 못하면 무용지물이 되기 때문에..
비교적 안전하다고 볼 수 있을겁니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

dcmru의 이미지

제가 드린 질문의 요지는 Client-Server 구조가 아닌 시스템 프로그램에서 단일 프로그램에서 데이터의 암호화에 사용하는 경우입니다.
이런 경우는 어떻게 볼 수 있을까요?

노력만이 살길이다.

ymir의 이미지

설정 파일이나 파일 DB 처럼 프로그램 혼자서 파일을 읽고 쓰고 하는데.. 그걸 암호화 해서 보호하고 있다는 의미인가요..?

그렇다면 그냥 key 를 저장하지 말고, 아주 큰 수 (1024 bit 이상) 를 만들어서 저장한 후에..
위 PSK 경우처럼 그걸 임의의 알고리즘들 돌리거나, 적당한 곳에서 잘라와서 키 생성 함수에 던져 진짜 암호키를 생성하면 될 겁니다.
거기에 몇 가지 변하지 않는 시스템 값을 뽑아 와서 섞어도 되구요.
예를 들면 /proc/cpuinfo 를 읽어서 hash 값을 뽑아 내서 키 데이터에 섞는다던가..

실행 파일 디버깅을 해서 키 데이터 위치를 유추한다 하더라도, 어떤 과정을 거쳐 키 데이터로 가공하는지 모르면..
진짜 암호키를 생성할 수 없기 때문에.. 소스 코드 유출되기 전까지는 상대적으로 안전하게 쓸 수 있을겁니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

dcmru의 이미지

프로그램 혼자서 자신의 데이터를 암/복호화 하는 의미가 맞습니다.
키의 생성을 자신만의 방법을 사용하라는 말씀으로 알아들었습니다.
이와 같이 사용하는 것이 보편적인가요?
질문처럼 키를 안전하게 저장하고 사용하는 방법은 없는 것인가요?

노력만이 살길이다.

ymir의 이미지

주로 C/S 에서만 놀다 보니.. 그게 보편적인지는 모르겠습니다만..

다만 키(패스워드)는 언제든 유출될 수 있다고 가정해 두는게 편하고..
그 상황에서 진짜 암호키를 알아 내지 못하게 하려면..? 이라는 문제를 해결하려면..
결국 키 생성 방법(알고리즘, 연산, 조합, 순서 등) 을 감추는게 간단하고 쉬운 방법이라는거죠.

설령 아무도 접근할 수 없고, 접근하더라도 키를 추출할 수 없는 방법을 만들었다 하더라도..
프로세스 또는 프로그램에 접근 권한이 있다면..
암호화 하는 순간에 메모리 덤프 떠서 진짜 키를 뽑아낼 수도 있습니다.
뭐 그정도면 그 어떤 방법도 무용지물이겠지만요..

DB 나 키 파일 삭제 같은 걸로 운영에 방해를 받을 수도 있으니..
보조적으로 permission 이나 selinux 같은 걸로 파일의 접근 권한을 제어하는 것도 도움이 될 거구요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

dcmru의 이미지

암호화 알고리즘과 키가 절대적인 방어막이 되지 않을 것이라는 말에 동의합니다.
말씀하신 것과 같이 충분히 다른 공격방법들로 정보의 유출이 가능할 것입니다.
다만 이를 방지하기 위해 키를 안전하게 보관할 수 있는 다른 방법이 있는지 문의를 했던 것입니다.

노력만이 살길이다.

ymir의 이미지

이제서야 질문의 요지를 알 것 같네요.

일단 결론적으로 보편적으로 통용되는 그런 방법은 없다고 봐도 될겁니다.
다만 그 상황에 맞는 적절한 방법을 선택해서 구현하면 되는데..
그 상황이란게 시스템, 목적, 용도, 운영 환경, 보안 요구 수준 등에 따라 천차 만별이라 결국 케바케입니다.

예를 들어 만약 시스템이 외부 사용자의 로그인을 허용하지 않는다면...
그냥 local 에 key 를 저장해 놔도 사실 별 상관은 없습니다.
단 이 경우의 보안 수준은 시스템 레벨이죠. 시스템이 뚫리면 모두 털리는거..
털리더라도 그걸 이용할 수 없어야 한다는 제한이 붙으면 먼저 언급했던 대로 몇가지 안전 장치를 추가하면 되구요.

몇 가지 고려할만한 점들을 보면...
가급적 키는 파일로 저장하지 않는게 좋고..
키 생성시 다양한 소스에서 값을 참조하고..
특정 하드웨어의 값을 참조하는 것도 좋고.. (예를 들어 USB 의 시리얼이라던가 어떤 값을 참조한다면, 그 USB 가 없으면 해독이 불가능해지죠.)
많은 클라이언트 또는 파일들을 식별해서 관리해야 하는 경우라면..
인증서 서버, 또는 키 서버를 구축해서 특정 프로토콜 외에는 아무도 접근하지 못하게 하고 네트웍을 통해 키를 가져온다거나..
하는 게 있을 수 있을겁니다.
그리고 반드시 시스템 보안수준도 동시에 고려되어야 합니다.

만약 많은 수의 파일이 있는데, 파일마다 서로 다른 키를 써야 하고 별도 서버를 쓸 수 없다는 조건이 붙으면..
각각 키와 파일명을 저장하는 것보다, 파일명을 키 생성에 쓴다거나, 암호화 된 파일 앞에 난수를 헤더로 붙여 키 데이터로 쓴다거나.. 하는 식으로..
키 정보를 감추고, 파일 구조를 바꿔버리면.. 오히려 관리포인트도 줄고 유추하기도 더 힘들어지겠죠.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지

로컬에서 뭔가를 하려고 하는 건 전부 무용지물입니다. 로컬 작업은 모든 것이 해킹될 수 있다고
가정을 해야 합니다. C/S 가 아니면 애초에 깊게 고민할 필요도 없습니다.

dcmru의 이미지

비슷한 상황의 예를 말씀드리면, 1Password 같은 프로그램을 생각해볼 수 있을 것 같습니다.
프로그램에서 여러 개의 비밀번호가 필요할 경우가 있겠지요.
프로그램은 서비스 형태로 돌아야 하기 때문에 파일을 암/복호화 하기 위한 여러 개 또는 하나의 키를 가지고 있어야 합니다.
1Password같은 프로그램은 여러 개의 비밀번호를 관리하는 도구이고 마스터 비밀번호로 다른 비밀번호를 암/복호화 할 것입니다.
이와 같은 형태의 키관리 표준이 있을 것 같습니다.
다만 이를 애플리케이션에 적용하는 것은 어떤식으로 사용하는 경우가 있는지 궁금한 것입니다.
공개키 알고리즘이 들어가고 복잡해 질려나요?

노력만이 살길이다.

익명 사용자의 이미지

대칭형 암호화의 키가 여러개 존재한다면, 그 키를 관리하기 위한 마스터 키는 비대칭형 암호화를 사용하는게 일반적? 이겠죠.
결국은 공개/비밀키 형식으로 가는 겁니다. 하지만 비대칭형은 신뢰도가 높지만 속도가 느리기 때문에 C/S환경에서도 실제로는 두가지의 암호화를 혼용하는 걸로 알고 있습니다.

①키 교환:비대칭형 암호화(공개/비밀키 형식) - 처리속도 느림 - 신뢰도 높음
②데이터 교환:대칭형 암호화 - 처리속도 빠름 - 신뢰도 중간?

처음 데이터 교환을 위해 키 교환만을 비대칭형으로 하는 겁니다. 그래서 공통된 키를 교환
했다면 그 키를 사용해서 다음부턴 대칭형 암호화로 데이터를 교환하는 거죠.

자세히는 모르지만 1password도 아마 위의 형식으로 움직이는게 아닐까 조심스레 짐작 해 봅니다.

이상입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.