어제도 이벤트 디스패치 스레드 구현 코드를 보던중.. 망할 시큐리티 매니저..   내 app의 입장을 넘어
jvm(여러 자바기반 app의 관리자 객체)의 입장에서 생각해 보았다.


내 app에서  클래스에 static을 사용한다는 의미, 클래스의 인스턴스(물론 refelct 관점에서 보면 클래스도 인스턴스(static

영역에 생성되는 object.. Class.forName("xxx.xx.a").newInstance)지만..논외) 를 static으로 접근하게 제공한다는것..

음.. 이해가 부족해 표현이 쉽지 않은데..

public class 계좌  //내 app의 모든 .class 파일에서 전역적으로 사용하기 위해 public 키워드
{
    public static 계좌 instance = new 계좌();
    public void 출금(){}
}

계좌클래스의 인스턴스는 어디에서건 계좌.instance로 "전역적=공유적"으로 접근및 계좌.instance.work() 서비스를 사용할수 
있다.(물론 패키지 선언및 다른 .class 파일에서 접근할땐 import를 하던지.. 아니면 패키지명.클래스명으로 사용하던지)

import 패키지.A;
public class 장호
{
   void 출금()
   {
       계좌.instance.출금();
    }
}


import 패키지.B;
public class 가짜장호
{
   void 출금()
   {
        계좌.instance.출금();
    }
}

물론 일반적으로 로그인 처리단계 -> 로그인 정보에 따라 서버단에서 db에 조회해서 dao를 통해 사용자의 
계좌 객체를 얻고 그것을 "서버단의 계좌 매니저" 객체에 보관하며, 로그인 결과에 따라 "검증하는 작업후" 인증된 사용자에 
대해 설정된 권만 만큼의 계좌 정보를 보여주고-> 사용자의 비지니스 로직(입금,출금,조회) 선택에 따라 다시 서버단에서 트랜
잭션및 예외등을 컨트롤해 가면서 dao를 통해 db단에 쿼리를 전달하고 -> 결과를 받아 사용자에게 피드백을 할것이다.
(뭐랄까.. 예전에 쇼핑몰 로그인 처리 구현했을때.. 19세 이상, 회원, 비회원 등으로 인증및 권한 설정을 통해 분기를 나누고 사용
자에 대한 view를 다르게 했던 것처럼..)

즉.. 장호의 계좌에 대해선 여러가지 비지니스 로직용 클래스의 객체가 공유할수 있지만.. 
장호의 계좌에 대해 "인가되지 않은 가짜장호가 접근"을 해서는 안될것이다.

아직 개념이 제대로 안섰는데.. 이걸 jvm과 여러 app 의 관계로 생각해보면
jvm은 서버의 입장, app는 클라이언트의 입장이 될것이다.
즉 jvm으로선 여러개의 app(app자체도 스레드를 여러개 사용가능)를 관리하게 되고.. 각각의 app는 서로에 대해 
"데이터에 대해 독립성 = heap 메모리, class 인스턴스라면 static 메모리 + 코드의 독립성 = stack 메모리"이 보장되어야 할 
것이다.

보안 개념(인증및 권한설정)을 좀 더 상위단에서 관리하기 위해.. 각 appcontext라는 걸 만들었고.. 각각을 컨테이너에
구성 요소로 관리함으로서 독립성을 보장할 것이다. (물론 이래야.. 여러 app들에 대해 시분할 처리가 될것이고..)
app라는건 jsp에 비유하면.. session의 개념이고 app내에서 발생하는 여러 이벤트(입,출력등 각종 처리)은 request의 개념일 
것이다.(정신이 점점 안드로메다로...OTL)

아직 시큐리티 매니저, appcontext, app의 eventQueue, 전체 시스템(os(jvm포함))의 eventQueue 에 대한 이해가
거의 없다. 또 한번 뜬구름을 잡는구나 ㅠㅠ


JNDI


JDBC와 JNDI

***** 
생각난 김에 예전에 보안문서중 자바 관련파트 확인 1회, java.security패키지와 관련 패키지 한번 더 체크


by givingsheart 2014. 1. 2. 09:30

http://blog.naver.com/genesung?Redirect=Log&logNo=130082920571 님감사해요.. (__ ) 


사실 채팅 프로그램에 대단한 보안이 필요한건 아니고.. 

대충 보아하니.. des인데.. 그럼 서버측, 클라측 코드에 String Key 하나씩 심어놔야하나?

어디다가 숨겨놔야 안전할까...끙 -_-;;;  그나저나 text.getBytes()하고 있네.. 그나마 반갑다.

내가 암호,복호화할 데이터도.. directByteBuffer님까 -_-;



import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

 

private static final String _cipherAlgorithm = "DES";

 

String encryptText(String text, String key)
{
    String encrypted;
        
    try
    {
        SecretKeySpec ks = new SecretKeySpec(generateKey(key), _cipherAlgorithm);
        Cipher cipher = Cipher.getInstance(_cipherAlgorithm);
        cipher.init(Cipher.ENCRYPT_MODE, ks);
        byte[] encryptedBytes = cipher.doFinal(text.getBytes());
        encrypted = new String(Base64Coder.encode(encryptedBytes));
    }
    catch (Exception e)
    {
        e.printStackTrace();
        encrypted = text;
    }
        
    return encrypted;
}

 

String decryptText(String text, String key)
{
    String decrypted;

    try
    {
        SecretKeySpec ks = new SecretKeySpec(generateKey(key), _cipherAlgorithm);
        Cipher cipher = Cipher.getInstance(_cipherAlgorithm);
        cipher.init(Cipher.DECRYPT_MODE, ks);
        byte[] decryptedBytes = cipher.doFinal(Base64Coder.decode(text));
        decrypted = new String(decryptedBytes);
    }
    catch (Exception e)
    {
        decrypted = text;
    }

    return decrypted;
}

 

byte[] generateKey(String key)
{
    byte[] desKey = new byte[8];
    byte[] bkey = key.getBytes();
        
    if (bkey.length < desKey.length)
    {
        System.arraycopy(bkey, 0, desKey, 0, bkey.length);
            
        for (int i = bkey.length; i < desKey.length; i++)
            desKey[i] = 0;
    }
    else
        System.arraycopy(bkey, 0, desKey, 0, desKey.length);
        
    return desKey;
}


'프로그래밍 > 보안' 카테고리의 다른 글

jvm의 입장?  (0) 2014.01.02
"보안" 관련 문서(2013.12.11 자바 보안객체 사용 추가)  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:35
자바 보안 관련 블로그




파이썬 보안 문서(자바도 쬐금 들었음)

http://heehiee.codns.com:9000/060611/0_%B8%B6%C0%CC%C5%A9%B7%CE%BC%D2%C7%C1%C6%AE%C0%E2%C1%F6/2002/9%BF%F9%C8%A3/New!%20About/0209-380.pdf




자바에서 보안관련 패키지 

java.security.MassegeDigest :요놈 생성해서,..update() 해서 사용하면 끝~~~ 초간단? 
(생성은 스태틱 메서드인   getInstance (String  algorithm)  매개변수는 "MD5" or "SHA")

이 MessageDigest 클래스는, MD5 또는 SHA 등의 메세지 다이제스트 알고리즘의 기능을 제공합니다. 메세지 다이제스트는, 
임의 사이즈의 데이터를 취득해 고정장의 해시치를 출력하는 안전한 한방향의 해시 기능입니다.

MessageDigest 객체는, 초기화되어 기동됩니다. 데이터는, MessageDigest 객체를 개입시켜 update 메소드를 사용해 처리됩니다. 
reset 메소드를 호출하는 것으로, 임의의 시점에서 다이제스트를 리셋 할 수 있습니다. 갱신 대상의 데이터가 모두 갱신된 시점에서,
digest 메소드의 1 개를 호출하는 것으로, 해시 계산을 종료할 필요가 있습니다.

digest 메소드는, 지정 회수의 갱신에 대해서 1 회 호출하는 것만으로 끝납니다. digest 메소드의 호출이 종료한 뒤, MessageDigest 
객체는 초기화 상태에 리셋 됩니다.

Cloneable 인터페이스는, 자유롭게 구현할 수 있습니다. 클라이언트 어플리케이션은, 복제의 생성을 시행해 CloneNotSupportedException 
를 캐치 하면, 복제의 생성이 가능한가 어떤가를 조사할 수가 있습니다.

MessageDigest md = MessageDigest.getInstance("SHA");

try {
md.update(toChapter1);
MessageDigest tc1 = md.clone();
byte[] toChapter1Digest = tc1.digest();
md.update(toChapter2);
...등
} catch (CloneNotSupportedException cnse) {
throw new DigestException("couldn't make digest of partial content");
 }

********************************************************************

java.security 
클래스 KeyFactory

X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
Signature sig = Signature.getInstance("DSA");
sig.initVerify(bobPubKey);
sig.update(data);
sig.verify(signature);

*******************************************************************
(RSA 관련 블로그)
http://blog.naver.com/PostView.nhn?blogId=nttkak&logNo=20130239694</p></div>



(추가)

나는 요때부터 보안에도 관심을 가졌었구나.. 하긴 오래전 게임 회사 일할때.. 해킹및 불법 사용자 문제로 고생을 했었지... 실제 서비스를 제공한다고 했을때, 보안이란 문제의 비중은 결코 가볍지 않다.

'프로그래밍 > 보안' 카테고리의 다른 글

jvm의 입장?  (0) 2014.01.02
패킷 암호화 코드 긁어온것 ㅠㅠ  (0) 2014.01.01
by givingsheart 2014. 1. 1. 16:09
| 1 |