엔진단은 Python으로 되어 있고, WEB은 JAVA로 되어 있는 프로젝트에서 AES 256기반의 암/복호화 처리를 한다.


단순하게 KEY와 SALT만 마춰주면 된다.

Python Source

from Crypto.Cipher import AES

import base64

import hashlib


BS = AES.block_size

pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

unpad = lambda s : s[0:-ord(s[-1])]


if __name__ == '__main__':

    key = "12345678901234567890123456789012"; # 32bit

    iv = '1234567890123456' # 16bit

    

    beforeCipher = 'abcd'

    print 'Input string: ' + beforeCipher


    cipher = AES.new(key, AES.MODE_CBC, IV=iv)

    beforeCipher = pad(beforeCipher)

    afterCipher = base64.b64encode(cipher.encrypt(beforeCipher))

    print 'Cipher string: ' + afterCipher


    cipher = AES.new(key, AES.MODE_CBC, IV=iv)

    deciphed = cipher.decrypt(base64.b64decode(afterCipher))

    deciphed = unpad(deciphed)

    print 'Deciphed string: [' + deciphed +']'

결과

Input string: abcd

Cipher string: nf2mDLb4L36PWlXz3mNPTw==

Deciphed string: [abcd]


JAVA Source

package lahuman;


import org.junit.Assert;


import javax.crypto.*;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import java.io.UnsupportedEncodingException;

import java.security.InvalidAlgorithmParameterException;

import java.security.InvalidKeyException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.spec.AlgorithmParameterSpec;

import java.util.Arrays;

import java.util.Base64;


import static org.hamcrest.Matchers.is;



public class Test {


    @org.junit.Test

    public void test() throws UnsupportedEncodingException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {

        String key = "1234567901234567980123456789012";

        String iv = "1234567890123456";


         String beforeCipher = "123456789012345";

        System.out.println("Input string: " + beforeCipher);


        SecretKey keyspec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

        AlgorithmParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));


        //Encription

        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");

        cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

        int blockSize = cipher.getBlockSize();

        byte[] dataBytes = beforeCipher.getBytes("UTF-8");


        //find fillChar & pad

        int plaintextLength = dataBytes.length;

        int fillChar = ((blockSize - (plaintextLength % blockSize)));

        if (plaintextLength % blockSize != 0) {

            plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));

        }

        byte[] plaintext = new byte[plaintextLength];

        Arrays.fill(plaintext, (byte) fillChar);

        System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);


        byte[] cipherBytes = cipher.doFinal(plaintext);

        String afterCiphered = new String(Base64.getEncoder().encodeToString(cipherBytes));

        System.out.println("Cipher string: " + afterCiphered);


        //Decription

        cipher = Cipher.getInstance("AES/CBC/NoPadding");

        cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

        byte[] base64decoded = Base64.getDecoder().decode(afterCiphered.getBytes("UTF-8"));

        byte[] aesdecode = cipher.doFinal(base64decoded);

        

        // unpad

        byte[] origin = new byte[aesdecode.length - (aesdecode[aesdecode.length - 1])];

        System.arraycopy(aesdecode, 0, origin, 0, origin.length);


        String originStr =  new String(origin, "UTF-8");

        System.out.println("Decipher string: [" + originStr + "]");

    }

}

결과

Input string: abcd

Cipher string: nf2mDLb4L36PWlXz3mNPTw==

Decipher string: [abcd]


Java에서 Python의 pad, unpad와 똑같이 동작 하기 위하여 Encryption시 fillChar을 찾고 pad처리를 하고, Decryption시 unpad 처리를 한다.


참고 자료

Python Java AES 

Posted by lahuman

Elastic Search 하나의 서버에서 여러 노드 구동시 설정

Elastic Search(이하 ES)에서 노드의 메모리는 서버의 메모리의 반(half)을 할당하는 것이 좋다고 한다.

다만 서버의 메모리가 큰 경우(128GB 이상) 32GB만 할당한 노드를 2개를 띄우는 것을 추천 한다.1,2

이때 일반적으로 ES를 여러개를 설치 하는 것이 아니라 설정 파일만 교체 하여 서버를 기동 하는 방식을 사용 한다. ** 설정 파일만 변경하는 것도 있는데 이는 동작 하지 않는다.**

# ES_PATH_CONF 설정으로 elasticsearch.yml 파일이 있는 위치를 설정 한다.
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch

참고 자료


Posted by lahuman

MariaDB를 binary tar.gz 파일로 설치 하자

일반적으로 설치 방법은 다음과 같이 3개의 방법이 있다.

  1. 패키지 관리 명령어를 이용한 설치
    • 데비안 계열의 apt-get
    • 레드햇 계열의 yum
  2. 배포 파일을 이용한 설치
    • 데비안 계열의 .deb
    • 레드햇 계열의 .rpm
  3. 바이너리 파일을 이용한 설치
    • 실행파일로 tar.gz 형태 제공

물론 모든 프로그램이 상위 3가지 버젼을 제공하지는 않는다.

오늘 정리할 내용은 이중 바이너리 파일을 이용한 설치이다.

먼저 바이너리 파일을 이용한 설치의 경우 설치 & 삭제가 쉽다는 장점이 있다.

  • 압축을 풀어서 놓은 디렉토리가 설치 위치가 된다.
  • 해당 디렉토리를 삭제하면 끝!

하지만 다음과 같은 단점도 있다.

  • 의존성있는 라이브러리 설치 따로 진행 해야한다.

설치 환경

  • OS : Ubuntu 16.04.3 LTS
  • Mariadb Version : 10.2.12

Mariadb Binary Download

Mariadb Binary Download URL : https://downloads.mariadb.com/MariaDB/mariadb-10.2.12/bintar-linux-x86_64/

mariadb-10.2.12-linux-x86_64.tar.gz 파일을 다운 받는다.

설치 진행

참고 자료 1를 참고 하여 설치를 진행 한다. 설치는 root 계정으로 한다.

groupadd mysql
useradd -g mysql mysql
cd /usr/local
tar -zxvpf /path-to/mariadb-VERSION-OS.tar.gz
ln -s mariadb-VERSION-OS mysql
cd mysql
./scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data

MariaDB 의존성 프로그램 설치

sudo apt-get install libaio1 libaio-dev

설정

설치가 완료 되면 설정을 진행 한다.

설정을 하기 전에 my.cnf 파일을 정해야 한다.

mariadb 압축 해제된 디렉토리를 보면 support-files 디렉토리가 있다.

그 안을 보면 다음과 같은 설정 파일 들이 있다.

  • my-huge.cnf
  • my-innodb-heavy-4G.cnf
  • my-large.cnf
  • my-medium.cnf
  • my-small.cnf

사용하려는 환경에 맞는 cnf파일을 mysql 디렉토리로 my.cnf 이름으로 변경하여 복사한다.

이후 다음 명령어를 실행한다.

./scripts/mysql_install_db --user=mysql --default-file=my.cnf

실행

설정이 완료 되면 이제 MariaDB를 실행 할 수 있다.

실행 명령어

./bin/mysqld_safe --datadir='./data' &

실행 이후, 가장 먼저 root의 비밀번호를 설정한다.

 ./bin/mysqladmin -u root password 'New Password'

접속 테스트

접속 테스트 명령은 다음과 같다.

 ./bin/mysql/ -uroot -p

참고 자료


'설치&설정 관련 > Mariadb' 카테고리의 다른 글

MariaDB를 binary tar.gz 파일로 설치  (0) 2018.01.15
[설치 & 셋팅 & 테스트]Mariadb 5.5  (0) 2014.03.03
Posted by lahuman

Eclipse와 JDK9에서 @PostConstruct 어노테이션 오류

오랜만에 Eclipse를 띄어서 이전 프로젝트를 확인 하는데 @PostConstruct 어노테이션을 찾을 수 없다는 오류가 보였다.

따로 변경한 것은 JDK 버젼을 8에서 9로 업그레이드 한거 말곤 없었다.

검색을 해보니 해당 문제에 대한 해결책이 있었다.

eclipse.ini 파일에 –add-modules=java.se.ee 옵션을 추가 하면 된다.

-vmargs
--add-modules=java.se.ee
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m

JDK9이 아직 안정화가 안된건지, 여러 모듈에서 오류가 발생한다.

참고 자료


Posted by lahuman