![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bLRLG3/btqAwlhvQoD/EUlwCLZlIUo3L3AJ0MRMJ0/img.png)
가. 원인 - 암호키가 소스코드에 하드코딩되어 암호화에 사용 나. 영향 - 실행파일이 유출 시, 디컴파일을 통해 암호화키가 유출되어 중요정보를 복호화 다. 보안대책 - 암호키는 암호화하여 안전한 별도의 위치에 저장 후 사용 라. 안전한 코드 1. 안전한 암호키 사용 public String encryptData( String plainText ) { String key = getPassword( "/var/password.ini" ); key = decrypt( key ); SecretKeySpec keySpec = new SecretKeySpec( key.getBytes(), "AES" ); ... Cipher cipher = Cipher.getInstance( "AES" ); cipher.init( ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/qqAux/btqAtCrqjvn/rczKPQ4ttLXUx3rkosvNVk/img.png)
가. 원인 - 예측 가능한 난수를 발생시키는 취약한 API를 사용 나. 영향 - 다음 숫자를 예상하여 시스템을 공격가능 다. 보안대책 - Java.lang.Math 클래스의 random 메서드의 사용을 자제 - Java.util.Random 클래스의 random 메서드를 사용 - 현재 시간을 기반으로 조합하여 매번 변경되는 시드값을 사용 - 보안결정을 위한 값을 생성 시 java.security.SecureRandom 클래스를 사용 라. 안전한 코드 1. Seed가 가능한 랜덤함수 사용 import java.util.Random; ... public int generateRandom( ... ) { int ran = -1; Date cur = new Date(); ... Random r = new Ran..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/btyWzz/btqAux4fxZq/n3v0KUtKgyBYGeRsCljXKk/img.png)
가. 원인 - 암호화에 사용하는 키의 길이가 충분하지 않을 경우 나. 영향 - 짧은 길이의 키를 사용하여 암호화 알고리즘을 취약하게 만듬 - 검증된 암호화 알고리즘을 사용하더라도 짧은 시간안에 키를 찾아내 중요정보를 복호화 다. 보안대책 - RSA와 같은 공개키 암호화 알고리즘은 2048bit 이상의 키를 사용 - AES / ARIA / SEED 등과 같은 대칭키 알고리즘은 128bit 이상의 키를 사용 라. 안전한 코드 1. 2048bit 이상의 RSA 암호화 키 사용 final KeyPairGenerator keyGen = KeyPairGenerator.getInstance( "RSA" ); keyGen.initialize( 2048 ); final KeyPair key = keyGen.generat..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/5BoiQ/btqAt6eLr34/fl8P47kljcZvX8KzWywAvK/img.png)
가. 원인 - 프로그램 내부에 비밀번호를 하드코딩한 경우 나. 영향 - 하드코드된 비밀번호를 내부인증에 사용하거나, 외부 컴포넌트와 통신에 사용할 경우, 관리자 정보가 노출될 수 있음 - 하드코드된 비밀번호가 인증실패를 야기할 경우, 원인파악의 어려움 발생 다. 보안대책 - 비밀번호는 암호화하여 별도의 파일이나 DB에 안전하게 저장 후 사용 - 디폴트 암호 대신 "최초 로그인" 모드를 사용하여 사용자가 직접 패스워드를 입력하도록 설계 라. 안전한 코드 1. DB계정정보 암호화 후 사용 private static final String DB_USER = "db_manager"; ... public Connection getConnection( ) { Connection conn = null; ... // ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/SKNqT/btqAuLOHx1i/z9lsOu1UHLThvE3K6q8Kxk/img.png)
가. 원인 - 사용자 및 시스템의 중요정보를 평문으로 송/수신할 경우 나. 영향 - 네트워크 스니핑을 통해 인가되지 않은 사용자에게 민감정보 등이 노출 다. 보안대책 - 로그인 시 반드시 HTTPS와 같은 안전한 통신채널을 사용 - 중요정보는 암호화 후 전송하거나 안전한 통신채널을 사용 - 중요정보를 쿠키로 전송할 경우, HTTPS통신으로만 값이 전달될 수 있도록 보안속성( setSecure(true) )을 설정 - 중요정보를 쿠키로 전송 시 HTTP 통신을 해야할 경우, 반드시 암호화 후 전송 라. 안전한 코드 1. 패스워드를 암호화 후 전송 String pwd = getPassword(); ... // 데이터 암호화 후 전송이므로 서버의 공개키로 양방향 암호화 처리 후 전송 // 서버의 비밀키로만 복..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/EZlmk/btqAt6TkD5M/2Yr1tY1FPSv8VsFxRMkkI0/img.png)
가. 원인 - 패스워드 / 개인정보 / 인증정보 / 금융정보 등의 중요정보를 암호화하지 않고 평문으로 저장 나. 영향 - 저장된 파일이나 DB정보가 유출될 경우, 개인정보, 패스워드 등의 중요정보 및 민감정보가 유출 다. 보안대책 - 개인정보 / 금융정보 / 패스워드 / 민감정보를 저장 시 암호화 후 저장 - 중요정보를 읽거나 쓸 경우에 권한검증을 수행 - 디스크나 메모리에 있는 민감한 데이터를 지울때 안전한 방식으로 삭제 라. 안전한 코드 1. 패스워드 암호화 후 저장 String pw = request.getParameter("password"); // 패스워드는 128비트 이상의 암호키를 사용하는 일방향 암호화 처리 후 저장 MessageDigest digest = MessageDigest.getI..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/zzRUL/btqAviyMp2f/hhgtebPftq7S1kbAZ2TJBk/img.png)
가. 원인 - 중요정보를 취약한 암호 알고리즘을 사용하여 암/복호화 처리 - BASE64와 같은 지나치게 간단한 인코딩으로 암/복호화 나. 영향 - 중요정보가 복호화 되어 노출 다. 보안대책 - 자체 개발한 암호화 알고리즘은 사용하지 않음 - 이미 검증된 표준화 된 암호화 알고리즘을 사용 - 3DES, AES, RSA, SHA2 등의 안전한 암호화 알고리즘을 사용 라. 안전한 코드 1. 안전한 암호화 알고리즘 사용 public byte[] encrypt( byte[] msg, Key key ) { byte[] result = null; try { Cipher c = Cipher.getInstance( "AES/CBC/PKCS5Padding" ); c.init( Cipher.ENCRYPT_MODE, k )..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ULV8p/btqAv1DzdrP/hPZZnwgRSTZdpapwdyPjd0/img.png)
가. 원인 - 중요 자원에 대한 읽기/수정/삭제 권한을 의도하지 않게 허가하는 경우 나. 영향 - 인가되지 않은 사용자가 중요 자원에 접근/사용/변조 등을 수행 다. 보안대책 - 설정파일 / 실행파일 / 라이브러리 등은 SW관리자만 읽고 쓸 수 있도록 설정 - 허가받지 않은 사용자가 중요 자원에 대한 접근을 제한 라. 안전한 코드 1. 파일 소유자만 읽을 수 있도록 권한 설정 ... String uploadFile = saveUploadFile( request ); File file = new File ( uploadFile ); // 첫번째 인자는 권한부여 여부 // 두번째 인자는 소유자(true) / 모든사용자(false)를 나타내며 디폴트는 true file.setExecutable( false )..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bbzTY5/btqAuM1aAVh/tkBgZqIMKMY1Fygf6y0X2k/img.png)
가. 원인 - 인가 사용자만 접근해야 하는 기능에 올바른 접근권한 검증을 수행하지 않을 경우 나. 영향 - 권한없는 사용자에 의해 기능이 사용됨 - 권한없는 사용자에 의해 데이터가 유출 다. 보안대책 - 역할에 따라 제공되는 정보와 기능의 노출을 최소화 - 사용자 권한 별 ACL을 적용 - URL 조작을 통해 리소스에 직접 접근할 수 없도록 차단 - 파라미터 조작을 통한 직접 접근을 할 수 없도록 차단 라. 안전한 코드 1. 권한검증 public ModelAndView deleteUserInfo( ... ) { String userID = (String) session.getAttribute("LoginID"); ... // 로그인 사용자가 유저정보를 삭제할 권한이 있는지 확인 if ( checkUser..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/nnC8z/btqAwkbLdJF/ayZ03YVki00VCi5shKPwf0/img.png)
가. 원인 - 적절한 인증과정 없이 중요정보를 열람 또는 변경처리 나. 영향 - 권한없는 사용자가 중요기능을 사용 - 권한없는 사용자가 중요정보를 변조 다. 보안대책 - 보안검사를 우회하여 서버에 접근할 수 없도록 설계 - 중요정보를 제공하는 페이지에 접근 시 재인증 수행 - 안전하다고 확인된 라이브러리나 프레임워크를 사용 라. 안전한 코드 1. 정보 소유자 검증 public ModelAndView modifyUserInfo( ... ) { String userID = (String) session.getAttribute("LoginID"); String requestID = request.getParameter("userID"); // 회원정보를 변경하려는 ID와 기능요청자의 ID가 동일한 사람인지 화..
- Total
- Today
- Yesterday