[Spring]暗号学


暗号学
  • 暗号技術シリーズ
  • 情報保護言語学と数学方法学
  • 暗号学でよく使われる用語
  • コメント:オリジナル
  • 、情報(データ)を含む
  • パスワード:内容を第三者が解読できない文字、数字、コードなど
  • に変更
  • 暗号化:コメントをパスワードに変更:
  • 復号:パスワードを平文
  • に変更
    暗号化の基本要素

  • コメント(データ)

  • アルゴリズム(Algorithm)
  • 文を暗号文とし、暗号文を暗号/復号する際に用いる一連の順序アルゴリズム

  • 鍵(key)
  • 暗号化ランダム性の任意の値
  • を追加

  • [コメント]->暗号化アルゴリズム+Key-><暗号文>

  • <暗号文>>復号アルゴリズム+Key>[コメント]
  • 暗号学の種類
  • 初期暗号学、現代暗号学
  • マシン(コンピュータ)は、暗号化を実行する前後に
  • を分割する.
    暗号システム
  • 暗号化/復号に必要な要素の組み合わせ
  • アルゴリズムと鍵は重要な要素
  • である.
  • アルゴリズム:暗号化/復号化のための数学的原理と実行手順
  • は暗号化アルゴリズムと復号化アルゴリズム
  • に分けられる.
  • アルゴリズムは理解しやすく、実施しやすいが、攻撃の面では
  • 強くなければならない.
  • 鍵:暗号化/復号化の知識(その他の情報)
  • キーは同じアルゴリズムであり、
  • を複数のユーザが使用できる.
    たいしょうキー暗号システム
  • 暗号鍵は復号鍵と同じ
  • である.
  • 鍵(Secrete Key)、慣用鍵(Conventional Key)、およびSingle Keyシステム(
  • とも呼ばれる)
  • は、送信者および受信者が秘密鍵を使用することのみを許可するシステム
  • である.
  • の利点:対称鍵アルゴリズムの復号速度は非対称システムよりずっと速い
  • 欠点:安全な鍵伝達メカニズム
  • が必要である
  • 対称鍵アルゴリズムのタイプ
  • DES
  • AES
  • SEED
  • 非対称鍵暗号システム
  • 暗号鍵は復号鍵とは異なる
  • である.
  • 公開鍵システム、
  • とも呼ばれる
  • 各ユーザは、独自の専用鍵と、利用可能な公開鍵のペアを有する
  • 鍵は2個ずつであり、これは
  • を意味する.
  • 公開鍵は秘密鍵
  • を認識できない.
  • 相手方公開鍵暗号化転送、相手方は秘密鍵で復号、コンテンツ転送
  • .
  • の利点:対称鍵割り当てよりも良い鍵割り当て
  • 欠点:暗号化/復号化速度が対称鍵より
  • 遅い
  • 非対称鍵アルゴリズムのタイプ
  • Diffie-Helloman
  • RSA
  • ECC
  • Hash関数
  • Hash関数は一方向アルゴリズムです
  • は暗号化されていますが、復号が不要な場合は
  • を使用します.
  • プロパティ
  • 圧縮(収縮):異なる長さの入力を固定長の出力に圧縮する関数
  • 一方向(One-Way):コメントを暗号化してハッシュコードを取得できますが、ハッシュコードを使用してコメント
  • を復元することはできません.
  • 効率:コメントからパスワード(ハッシュ値)まで、リソースと時間があまり必要ありません.
  • Collision-free:メッセージが一意の場合、ハッシュ値も一意の
  • です.
  • ハッシュ関数タイプ
  • MD5
  • 128ビット固定長結果値(16バイト)
  • SHA-1
  • 160ビット固定長結果値(20バイト)
  • SHA-256
  • 256ビット固定長結果値(32バイト)
  • MD5
  • SHA(SHA-1、SHA-128、SHA-256等)
  • 暗号化後にリカバリする必要があるデータについては、対称鍵/非対称鍵アルゴリズムを使用します.
  • DBに記憶する個人情報
  • 暗号化後、データを復元する必要がない場合はHash関数を使用します.
  • DBに格納パスワード
  • AOPによる暗号化
    aop-context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
    </beans>
    application-context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <import resource="/jdbc-Context.xml"/>
    <import resource="/aop-Context.xml"/>
    </beans>
    SHA256Util Class
    package kr.or.iei.common;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import org.springframework.stereotype.Component;
    @Component
    public class SHA256Util {
    
    	public String encryptionData(String data, String salt) throws Exception {
    		
    		MessageDigest mDigest =  MessageDigest.getInstance("SHA-256");
    		
    		String str=data+salt;
    		
    		mDigest.update(str.getBytes());
    		
    		byte[] encryptMsg = mDigest.digest();	// 암호화 처리한 값 리턴
    		 
    		StringBuffer hexString=new StringBuffer();
    		
    		for(byte b : encryptMsg) {
    			hexString.append(String.format("%02X",b));
    		}
    		
    		return hexString.toString();
    	}
    }
    MemberAOP Class
    @Aspect
    @Component
    public class MemberAOP {
    
    	@Autowired
    	private SHA256Util enc;
    
    	// 회원가입 암호화 처리 AOP 로직
    	@Pointcut("execution(int kr.or.iei.member.model.service.MemberServiceImpl.insertMember(..))")
    	public void insertMemberPointCut() {
    	}
    
    	@Before("insertMemberPointCut()")
    	public void insertMemberPasswordEncryption(JoinPoint jp) throws Exception {
    
    		Member m = (Member) jp.getArgs()[0];
    
    		String userPwd = m.getUserPwd();
    		String userId = m.getUserId();
    
    		String encryptPwd = enc.encryptionData(userPwd, userId);
    
    		m.setUserPwd(encryptPwd);
    
    	}
    MemberController Class
    @Controller
    public class MemberController {
    
    	@Autowired
    	private MemberService mService;
    
    	@RequestMapping(value = "/member/memberJoin.do", method = RequestMethod.POST)
    	public ModelAndView memberJoinus(Member m, ModelAndView mav) {
    
    		// view페이지 보낸 데이터 받는 방법
    		// 1. request 객체 사용 - request.getParameter();
    		// 2. @requestParam 사용 - ex) @requestParam String userId
    		// 3. VO를 활용하는 방법(서로 다른 여러 객체 사용 가능) - ex) 인자 값을 Member m 설정
    
    		int result = mService.insertMember(m);
    
    		if (result > 0) {
    			mav.addObject("msg", "회원 가입 성공");
    			mav.addObject("location", "/");
    		} else {
    			mav.addObject("msg", "회원 가입 실패 - 지속적인 문제 발생시 관리자에게 문의 -");
    			mav.addObject("location", "/member/joinPage.do");
    		}
    
    		mav.setViewName("member/msg");
    
    		return mav;
    
    	}
    MemberService Interface
    public interface MemberService {
    	int insertMember(Member m);
    }
    MemberServiceImpl Class
    @Service
    public class MemberServiceImpl implements MemberService{
    
    	@Override
    	public int insertMember(Member m) {
    		return mDAO.insertMember(m);
    		
    	}
    }
    MemberDAO Class
    @Repository
    public class MemberDAO {
    
    	@Autowired
    	@Qualifier(value = "jdbcTemplate")
    	JdbcTemplate jdbc;
    
    	public int insertMember(Member m) {
    		
    		String query="INSERT INTO MEMBER VALUES(MEMBER_SEQ.NEXTVAL, ?, ?, ?, ?, ?, SYSDATE, 'N')";
    		
    		return jdbc.update(query, m.getUserId(), m.getUserPwd(), m.getUserName(), m.getAge(), m.getAddress());
    		
    	}
    }