저는 '멤버'테이블에 저장해야하는 귀중한 정보를 가지고있는 프로젝트를 진행하고 있습니다. 테이블 구조는 다음과 같습니다.
id | username | password | salt | last_name
———|——————————|——————————|——————|———————————
1 | VARCHAR | HASH | CHAR | BLOB
2 | VARCHAR | HASH | CHAR | BLOB
3 | VARCHAR | HASH | CHAR | BLOB
4 | VARCHAR | HASH | CHAR | BLOB
5 | VARCHAR | HASH | CHAR | BLOB
이 예에서는 last_name
키로 암호화됩니다. 해당 키는 'keys'테이블에 저장됩니다.
id | key
———|——————
1 | BLOB
2 | BLOB
3 | BLOB
4 | BLOB
5 | BLOB
이러한 키는 해시되지 않은 암호, ID 및 사용자 이름에서 파생 된 다른 키로도 암호화됩니다.
데이터베이스가 도난 당하면 도둑이 테이블 'keys'의 키를 추출 할 수없고 궁극적으로 last_name
.
이것이 정말로 저장되었는지 또는 키를 저장하는 다른 방법이 있는지 확인하고 싶었습니다.
이를 키 래핑이라고하며 안전합니다.하지만 키를 암호화 할 때는 특별히 설계된 암호를 사용해야합니다. 이 질문 에는 이유에 대한 적절한 설명이 있습니다.
사용중인 언어가 확실하지 않지만 Java에서는 다음과 같이 할 수 있습니다.
Key rootKey = new SecretKeySpec(keyBytes, "AES");
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(128);
Key keyToWrap = generator.generateKey();
Cipher cipher = Cipher.getInstance("AESWRAP");
cipher.init(Cipher.WRAP_MODE, rootKey);
byte[] wrappedKey = cipher.wrap(keyToWrap);
Cipher uncipher = Cipher.getInstance("AESWRAP");
uncipher.init(Cipher.UNWRAP_MODE, rootKey);
Key unwrappedKey = uncipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
또한 SCrypt와 같은 좋은 키 유도 기능을 사용하여 각 사용자의 루트 키를 유도하십시오. Bouncy Castle 에는 Java 및 C # 모두에 대한 SCrypt 구현과 자체 키 랩 구현이 있습니다. 또는 여기 에서 PHP SCrypt 구현을 찾을 수 있습니다 .
명심 마십시오 당신의 체계를 제공하지만 사용자가 비밀번호를 잊어 버린 경우 자신의 루트 키 암호에서 파생되기 때문에 자신의 암호화 된 데이터를 복구 할 수 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다