2013-09-03 3 views
1

데이터베이스에 사용자 이름과 암호 목록을 저장하고 일부 사이트에 로그인하여 작업을 수행하는 시스템을 만들고 있습니다. 암호를 안전한 방법으로 데이터베이스에 저장하려고합니다. 해시를 제한적으로 이해 했으므로 나중에 일반 텍스트를 다시 가져와야하므로 사용할 수있는 것이 아닙니다. 또한 데이터베이스에 암호화 된 암호를 저장하는 것은 나쁜 습관이라고 들었습니다. 그렇다면 어떤 접근 방식을 취할 수 있습니까?암호를 일반 텍스트로 암호 해독해야하는 경우 데이터베이스의 암호를 어떻게 암호화합니까?

+0

암호화 된 비밀번호 저장은 훌륭하지만 암호화를 해독하는 것은 좋지 않습니다. 따라서 암호를 잊어 버린 암호 대신 데이터베이스에서 암호화 된 암호를 해독하는 대신 사용자가 암호를 재설정하고 다른 암호를 생성하도록하십시오. –

+0

더 나은 암호 저장 데이터베이스가 해킹 된 경우에도 해시가 원래 암호를 볼 수 없기 때문에 해시가 암호화 된 암호를 저장하는 것보다 데이터베이스에 해시가 있습니다. 어쨌든 암호를 일반 텍스트로 왜 원하는가? – codeMan

+0

일단 암호를 저장하면 나중에 암호를 검색하고이를 사용하여 시스템을 통해 전자 메일 웹 사이트에 로그인합니다. 해시 코드를 웹 사이트로 보낼 수 있습니까? 만약 내가이 시스템을 통해 Gmail에 로그인한다면 어떻게 할 것인가? 만약 비밀번호를 해시로 저장한다면? – Aneesh

답변

2

나는 당신이 당신의 질문에 대답 생각하는 자신 :

하면 사용자가 인증 할 수 있도록/비밀번호를 useraname를 저장해야하는 경우 앱에 권장되는 방법은 비밀번호 해시를 저장하는 것입니다. 이렇게하면 데이터베이스가 손상된 경우에도 암호를 복구 할 수 없습니다.

하지만 시나리오가 다릅니다. 다른 사이트에 액세스하기 위해 사용자 이름/비밀번호 목록을 저장하려고합니다. 당신이 말했듯이, 당신은 그들을 일반 텍스트로 되돌릴 수 있어야합니다. 암호화가 유일한 방법 인 것 같습니다.

모두 password managers과 동일한 문제입니다. 비밀번호 목록은 목록을 관리하는 데 사용하는 "마스터"비밀번호만큼 안전합니다.

+0

나는 당신이 질문을 이해 한 유일한 사람이라고 생각합니다. 아마 내가 더 잘 설명해야만했을 것입니다. – Aneesh

+0

그래서 메일 서버에 일반 텍스트를 보내고 있다면, 그것을 밖으로 냄새 맡기가 쉽지 않을까요? 보내는 암호를 암호화하는 보편적 인 방법이 있습니까? 아니면 서버에 종속되어 있습니까? – Aneesh

+0

@ user2067771 보안을 강화하기 위해 SSL 연결 (예 : 암호화 됨)을 사용하여 다른 서버에 연결할 수 있습니다. 이는 일반 텍스트로 사용자 이름/비밀번호로 웹 사이트에 로그인하는 것과 같지만 HTTPS를 사용하여 스니핑을 방지합니다. – ewernli

-1

당신은 시도 할 수 있습니다이

import java.io.UnsupportedEncodingException; 
import java.security.GeneralSecurityException; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.PBEKeySpec; 
import javax.crypto.spec.PBEParameterSpec; 

import sun.misc.BASE64Encoder; 

public class EncryptUtil { 
private static final byte[] SALT = { 
    (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, 
    (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, 
}; 

private static String encrypt(String property, char[] password) throws GeneralSecurityException, UnsupportedEncodingException { 
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password)); 
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
    pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); 
    return base64Encode(pbeCipher.doFinal(property.getBytes("UTF-8"))); 
} 

private static String base64Encode(byte[] bytes) { 
     // NB: This class is internal, and you probably should use another impl 
     return new BASE64Encoder().encode(bytes); 
    } 

    public static String encryptPassword(String username, String password) throws  UnsupportedEncodingException, GeneralSecurityException{ 
     char[] pwChar = password.toCharArray(); 
     String encryptedPassword = encrypt(username, pwChar); 
     return encryptedPassword; 
    } 
} 

그럼 그냥 전화 기능 encryptPassword()

+0

질문에 "... 암호를 일반 텍스트로 암호 해독해야하는 경우"라는 문구가 명확하게 표시됩니다. 이 질문에 어떻게 대답합니까? –

+0

DES, MD5, static salt,'sun.misc. *'... 모든 것이 잘못되었습니다. – ntoskrnl

0

암호가 어떤 용도로 사용되는지 상상할 수는 없지만 MySQL의 AES encryption-decryption functions을 쉽게 사용할 수 있습니다. 각 사용자마다 고유 한 키를 사용할 수 있다면 더 좋습니다.

+0

내가 아는 한, MySql의 암호화 기능은 IV 벡터 (EBC 모드 만 제공)를 제공하지 않기 때문에 매우 약합니다. 키를 저장해야하는 주된 문제는 여전히 열려 있습니다. – martinstoeckli

관련 문제