[Android] adb wifi debugging 사용 방법

  1. 안드로이드 기기에서 개발자 옵션 켜기
  2. 개발자 옵션에서 “무선 디버깅” 켜기
  3. 무선 디버깅에서 페어링 코드로 기기 페어링 선택
  4. 호스트 컴퓨터에서 휴대폰에 나온 화면의 IP 주소 및 포트대로 adb pair <IP>:<PORT> 실행
    • 예제: adb pair 192.168.0.4:33917
  5. 호스트 컴퓨터에서 휴대폰에 나온 화면의 페어링 코드를 입력
    • 예제: Enter pairing code: 656685
  6. 연결됨. 호스트 컴퓨터에서 adb devices 를 실행하면 연결된 기기가 보일 것.
 dasomoli> ~> adb devices
List of devices attached
adb-R3CRC0G1A8L-FkwYCP._adb-tls-connect._tcp	device

[Security] bcrypt 정리

🔐 bcrypt란?

bcrypt는 1999년에 Niels ProvosDavid Mazieres가 개발한 암호화 해시 함수로, Blowfish 대칭 키 암호화 알고리즘을 기반으로 만들어졌습니다. 주로 웹 애플리케이션에서 사용자의 비밀번호를 안전하게 저장하기 위해 사용됩니다.

✅ 주요 특징

1. Salt 내장

  • bcrypt는 자동으로 salt를 랜덤 생성하여 포함시킵니다.
  • salt는 같은 비밀번호도 다른 해시 결과를 만들게 하여 무작위성을 증가시키고 레인보우 테이블 공격을 방어합니다.

2. 비용 증가 (Cost factor)

  • cost 또는 work factor는 해시 계산에 걸리는 연산 횟수(또는 시간)를 조절합니다.
  • 예: cost 10이면 2¹⁰ = 1024번의 해시 계산을 수행합니다.
  • 이를 통해 컴퓨터 성능이 높아져도 쉽게 크래킹되지 않도록 시간적 방어 장치를 제공합니다.

3. 느린 연산

  • 빠른 해시 함수(SHA-256 등)는 brute-force 공격에 더 취약한 반면, bcrypt는 의도적으로 느리게 설계되어 공격자를 어렵게 만듭니다.

4. 결과에 버전과 cost 정보 포함

$2b$10$Qcfksu5KwUepA.zVDkkw4Oco0z14Kz2jgfD6sdoGieQfztY1KaIhK
└┬┘└┬┘└─────── Salt ────────┘└─────── Hashed result ───────┘
 │  │
 │  └── Cost factor (2의 10제곱 = 1024번 해싱)
 └────── 버전 (2a, 2b, 2y 등)
  • 2b → bcrypt 알고리즘 버전
  • 10 → cost factor (해시 반복 횟수 조절)
  • 그 뒤 22자 → salt (Qcfksu5KwUepA.zVDkkw4O)
  • 나머지 → 실제 해시된 비밀번호

⚠️ 주의할 점

  • bcrypt는 암호화(encryption)가 아닌 해싱(hash)입니다. 즉, 원래 값을 복호화할 수 없습니다.
  • 사용자가 로그인할 때는 입력된 비밀번호를 같은 방식으로 해시하고, 저장된 해시와 비교(compare)하여 확인합니다.
  • 비밀번호가 노출되었을 경우, 단방향이기 때문에 해시만으로는 원래 값을 알 수 없습니다.

💻 Mac에서 간단히 CLI로 해시를 생성하는 방법

🔹 Homebrew로 bcrypt 설치

brew install bcrypt

🔹 비밀번호 해싱

echo "yourPasswordHere" | bcrypt
  • 예시 출력:
$2a$06$D9f2gKT8iJ1Lg/YhH9QpneCn7vD0Qx7xDdwU5k7AlhOPKfMyVPMta

💻 node.js 예제 코드

🔹 프로젝트 폴더 생성 후 bcrypt 설치

mkdir bcrypt-demo && cd bcrypt-demo
npm init -y
npm install bcrypt

✅ bcrypt-hash.js: 해시 생성 코드

const bcrypt = require('bcrypt');

// 커맨드라인에서 입력받은 비밀번호
const [,, password] = process.argv;

// 유효성 검사
if (!password) {
  console.error("❗ 사용법: node bcrypt-hash.js <비밀번호>");
  process.exit(1);
}

const saltRounds = 10; // 기본 비용 계수 (2^10 = 1024번 해시 반복)

// 해시 생성
bcrypt.hash(password, saltRounds, (err, hash) => {
  if (err) {
    console.error("❌ 에러:", err.message);
    process.exit(1);
  }

  console.log("🔐 bcrypt 해시 결과:");
  console.log(hash);
});

✅ 사용 방법

테스트 예시:

node bcrypt-hash.js mySecretPassword

✅ bcrypt-test.js: 해시 검증 코드

const bcrypt = require('bcrypt');

// 커맨드라인 인자 받아오기
const [,, inputPassword, hashedPassword] = process.argv;

// 유효성 검사
if (!inputPassword || !hashedPassword) {
  console.error("❗ 사용법: node bcrypt-test.js <암호> <해시>");
  process.exit(1);
}

// 비밀번호 검증
bcrypt.compare(inputPassword, hashedPassword, (err, result) => {
  if (err) {
    console.error("❌ 에러 발생:", err.message);
    process.exit(1);
  }

  if (result) {
    console.log("✅ 비밀번호가 일치합니다!");
  } else {
    console.log("❌ 비밀번호가 일치하지 않습니다.");
  }
});

✅ 사용 방법

테스트 예시:

node bcrypt-test.js mySecretPassword '$2b$10$WnV2Kk1aR8...'

[Kafka] Kafka 대용 오픈소스 redpanda 설치 및 설정

Ubuntu 24.04 에 repository 방식으로 설치할 때 다음과 같이 한다.

curl -1sLf \\
  '<https://dl.redpanda.com/public/redpanda/setup.deb.sh>' | sudo -E bash
sudo apt-get install -y redpanda-rpk
sudo apt update
sudo apt install redpanda

broker.dasomoli.org 로 사용한다면, /etc/redpanda/redpanda.yaml 설정 파일 편집. 다음 부분을 고침.

  - address: "broker.dasomoli.org"
    port: 9092

서비스 시작

sudo systemctl enable --now redpanda

서비스 상태 확인

sudo systemctl status redpanda
rpk cluster info --brokers broker.dasomoli.org:9092

사용 중인 토픽 리스트 확인

rpk topic list --brokers broker.dasomoli.org:9092

위의 절차는 인증 없이 사용하게 된다.

[VPN] FortiGate 장비와 MacOS 사이의 IPSec 터널 설정

FortiGate 설정

IPSec Tunnels 생성

Network

  • Remote Gateway: “Dialup User”, Interface: “wan1″(공인 IP가 연결된 WAN 포트)
  • Local Gateway: Disable
  • Mode Config: Disable
  • NAT Traversal: Enable
  • Dead Peer Detection: On Idle
  • Add route: Disable
  • Auto discovery sender / receiver: Disable
  • Device creation: Enabled
  • Tunnel search: Selectors

Authentication

  • Method: Pre-shared Key
  • Pre-shared Key: 정한 PSK를 적는다. 아래 MacOS 설정의 ipsec.secrets 와 당연히 동일(e.g. mySecretKey)해야 한다.
  • IKE Version: 1
  • IKE Mode Main(ID protection)
  • Peer Options: Accept Types는 Specific peer ID로 하고 Peer ID로 아래 ipsec.confleftid와 동일(e.g. dasomoli.org)해야 한다.

Phase 1 Proposal

  • Encryption: AES256
  • Integrity: SHA256
  • DH Group: 14
  • Key Lifetime (seconds): 86400

XAUTH

  • Type: Disabled

Phase 2 Selectors

  • Subnet1
    • Local Address: 192.168.64.0/19 (192.168.64.0/255.255.224.0)
    • RemoteAddress: 192.168.0.0/24 (192.168.0.0/255.255.255.0)
    • Encryption: AES256, Integrity: SHA256, DH Group: 14
    • Enable Replay Detection: Enabled
    • Enable Perfect Forward Secrecy (PFS): Enabled
    • Local Port/Remote Port/Protocol: Enabled
    • Key Lifetime: 3600
  • Subnet2
    • Local Address: 10.30.0.0/16 (10.30.0.0/255.255.0.0)
    • RemoteAddress: 192.168.0.0/24 (192.168.0.0/255.255.255.0)
    • Encryption: AES256, Integrity: SHA256, DH Group: 14
    • Enable Replay Detection: Enabled
    • Enable Perfect Forward Secrecy (PFS): Enabled
    • Local Port/Remote Port/Protocol: Enabled
    • Key Lifetime: 3600

Log 확인

FortiGate CLI에서 확인

diagnose vpn ike gateway list

또는:

diagnose vpn tunnel list

그 외.

  • Static Routes에 터널 연결된 PC로의 routing이 추가되어야 한다.
  • Firewall Policy가 추가된 IPSec 터널을 위한 인터페이스에 incoming/outgoing 모두 허용되어야 한다.
    • NAT는 이 경우 Disable하여야 한다.

MacOS 설정

1. 사전 준비

1.1. strongswan 설치

strongswan 을 설치한다.

brew install strongswan

2. 설정 파일 작성

/opt/homebrew/etc/ipsec.conf 설정 파일을 작성한다.

  • left: 내 Mac
  • right: FortiGate의 공인 IP
  • leftid, rightid: FortiGate와 일치해야 함
  • leftsubnet: 집 네트워크
  • rightsubnet: FortiGate 내부 네트워크
  • ike나 esp의 aes256-sha256-modp2048 는 Encryption: AES256, Integrity: SHA256, DH Group: 14를 의미한다. 느낌표(!)는 강제 적용을 의미한다.
config setup
    charondebug="ike 2, knl 2, cfg 2, net 2, esp 2"

conn fortigate
    keyexchange=ikev1
    aggressive=no
    authby=psk
    forceencaps=yes
    installpolicy=yes
    type=tunnel
    left=%defaultroute
    leftid=@dasomoli.org
    right=11.13.3.1
    rightid=11.13.3.1
    leftsubnet=192.168.0.0/24
    rightsubnet=192.168.64.0/19,10.30.0.0/16
    leftupdown=/opt/homebrew/etc/ipsec-updown.sh
    ike=aes256-sha256-modp2048!
    esp=aes256-sha256-modp2048!
    ikelifetime=86400s
    lifetime=3600s
    dpdaction=restart
    auto=start

설정 파일에서 사용하는 /opt/homebrew/etc/ipsec-updown.sh 를 작성한다. 이는 strongSwan은 macOS에서 커널 라우팅 테이블에 자동으로 라우트를 추가하지 않기 때문이다. 이는 macOS 커널이 PF_ROUTE를 통해 정책 기반 라우팅을 제공하지 않기 때문이다. 따라서 updown 스크립트를 활용해 수동 라우팅을 추가한다.

#!/bin/sh
case "$PLUTO_VERB" in
    up-client)
        /sbin/route add -net 10.30.0.0/16 -interface $PLUTO_INTERFACE
        /sbin/route add -net 192.168.64.0/19 -interface $PLUTO_INTERFACE
        ;;
    down-client)
        /sbin/route delete -net 10.30.0.0/16
        /sbin/route delete -net 192.168.64.0/19
        ;;
esac

PSK를 /opt/homebrew/etc/ipsec.secrets 파일 안에 다음과 같이 넣는다.

@dasomoli.org @fortigate : PSK "mySecretKey"

3. 실행 방법

macOS에서는 시스템 서비스로 실행되지 않기 때문에, 수동으로 아래와 같이 실행한다.

sudo ipsec start

또는

sudo ipsec down fortigate
sudo ipsec up fortigate

로그 확인:

log show --predicate 'process == "charon"' --info --last 5m

연결 확인:

ipsec statusall

종료:

sudo ipsec stop

라우팅 확인:

route -n get 10.30.0.1

혹은:

netstat -rn | grep 10.

[VPN] IPSec 터널 및 IKE 연결 방식

IPSec 터널은 인터넷 프로토콜 보안(IPSec, IP Security)을 이용해 두 네트워크 간에 암호화된 통신 경로(터널)를 만드는 기술입니다. 보통 VPN(Virtual Private Network)의 핵심 기술 중 하나로 사용되며, 안전하게 데이터를 송수신할 수 있도록 해줍니다.

IPSec 터널이란?

  • IPSec 터널 모드(IPSec Tunnel Mode)는 네트워크 장비(예: 라우터, 방화벽 등) 간에 암호화된 가상의 터널을 형성하여, 두 개의 네트워크 간에 안전한 통신을 가능하게 합니다.
  • 인터넷 같은 불특정 다수가 접근 가능한 네트워크 위에 안전한 통신 경로를 구축하는 것이 목적입니다.

작동 방식

  1. 터널의 양 끝단 장비(예: VPN 게이트웨이)는 서로를 인증합니다. (보통 사전 공유 키(PSK), 인증서 등을 사용)
  2. IKE(Internet Key Exchange)를 통해 보안 매개변수를 협상하고, 세션 키를 교환합니다.
  3. 실제 데이터가 오갈 때는 ESP(Encapsulating Security Payload)AH(Authentication Header) 프로토콜을 통해 데이터를 암호화하고 인증합니다.
  4. 암호화된 IP 패킷을 새로운 외부 IP 헤더로 감싸 전송합니다. (이게 ‘터널 모드’의 핵심)

IPSec 터널 연결 단계 (IKEv1 또는 IKEv2 기준)

IPSec 연결은 보통 두 단계로 나뉩니다:

  1. IKE Phase 1: 인증 및 보안 채널 수립
  2. IKE Phase 2 (IPSec Phase): 실제 데이터 통신에 사용할 세션 키 생성

Phase 1: IKE Security Association 수립

목표: 두 장비 간에 안전한 제어 채널 (IKE SA)을 먼저 수립하여, 이후 민감한 설정 정보를 안전하게 교환할 수 있게 함.

1.1. IKE 협상 시작

  • 양쪽 장비(IPSec peer)가 연결을 시작함 (Initiator와 Responder)
  • 서로 지원 가능한 암호화 알고리즘, 인증 방법 등을 교환
    • 예: AES-256, SHA-256, DH Group 14 등

1.2. Diffie-Hellman 키 교환

  • 서로 키 정보를 주고받아 공유 비밀 키 생성 (이 키는 암호화에 사용됨)
  • 이 과정은 공개키 기반이지만, 공유된 키는 외부에서 알 수 없음

1.3. 인증 수행

  • 서로의 신원을 인증 (보통 다음 중 하나 사용):
    • Pre-Shared Key (PSK): 양쪽에 같은 비밀번호 설정
    • 디지털 인증서: PKI 기반
    • EAP 방식: 사용자 인증용

1.4. IKE SA 생성 (Secure Association)

  • 위 과정이 완료되면, 양쪽 장비 간에 암호화된 안전한 제어 채널 생성됨

Phase 2: IPSec Security Association 수립

목표: 실제 데이터를 암호화하기 위한 IPSec 터널 (IPSec SA)을 만들고, 트래픽을 전송할 준비를 마침

2.1. IPSec 프로토콜/정책 협상

  • 어떤 프로토콜을 쓸지 협의
    • ESP (Encapsulating Security Payload): 암호화와 인증 제공 (일반적으로 사용)
    • AH (Authentication Header): 인증만 제공 (거의 안 씀)
  • 어떤 암호화 알고리즘을 사용할지 결정 (예: AES, 3DES, SHA 등)

2.2. 세션 키 생성

  • Phase 1에서 공유된 비밀 키를 기반으로 실제 트래픽을 암호화할 키 생성

2.3. IPSec SA 생성

  • 양쪽 장비는 서로에게 암호화된 트래픽을 보낼 수 있는 IPSec 터널을 완성

이후: 데이터 통신

  • 이제부터는 이 IPSec 터널을 통해 모든 데이터가 암호화되어 전송됨
  • 클라이언트 또는 네트워크 장비는 인터넷을 통해 전송되지만 내부처럼 안전한 연결을 경험

요약: 단계별 체크리스트

단계설명키워드
Phase 1제어 채널 설정IKE, DH 키 교환, PSK/인증서, 암호화
Phase 2터널 설정ESP, IPSec SA, 트래픽 선택자
이후암호화된 데이터 전송실제 사용자 데이터 암호화

IKE는 어떤 방식으로 연결되나요?

기본 프로토콜

  • IKE는 UDP 기반 프로토콜입니다.
  • 즉, TCP가 아닌 UDP를 사용하며, 신뢰성 있는 연결을 보장하지는 않지만 빠른 통신이 가능합니다.

IKE가 사용하는 포트

포트 번호프로토콜설명
UDP 500번 포트IKE (v1, v2 모두)IKE SA를 설정하기 위한 초기 패킷 전송에 사용됨
UDP 4500번 포트NAT-T (NAT Traversal)NAT 환경에 있는 경우 ESP 대신 이 포트를 사용하여 UDP로 터널링
ESP 프로토콜 (IP 프로토콜 번호 50)암호화된 실제 데이터IKE 설정 후 데이터 트래픽에 사용됨 (포트 X, IP 프로토콜 50)
AH 프로토콜 (IP 프로토콜 번호 51)인증 전용 (거의 안 씀)선택적 사용

연결 흐름 간단 요약

  1. UDP 500으로 IKE SA 협상 시작
  2. NAT 환경이면 → NAT-T가 감지되어 UDP 4500으로 포트 전환
  3. Phase 2까지 완료되면 → ESP(IP 프로토콜 50) 또는 AH(IP 프로토콜 51)로 암호화된 데이터 전송

NAT 환경 예시

만약 장비 뒤에 NAT가 있을 경우 (예: 공유기):

  • 일반 ESP 패킷은 NAT 장비에서 막히거나 변조됨
  • 이때 NAT-T (UDP encapsulation)이 작동하여 ESP를 UDP 4500 포트로 감싸서 전송함 → NAT 환경에서도 통신 가능

참고 예시 (방화벽 설정 시)

허용해야 할 포트/프로토콜목적
UDP 500IKE Phase 1/2
UDP 4500NAT 환경에서의 IKE 및 ESP 트래픽
ESP (IP 프로토콜 50)암호화된 데이터 (터널링된 트래픽)
AH (IP 프로토콜 51)인증용 데이터 (선택적)

주의: ESP는 TCP/UDP 포트가 아니라 IP 프로토콜 번호 50입니다. 방화벽에서는 포트가 아닌 프로토콜 번호로 허용해줘야 합니다.

[Hyperledger Besu] IBFT 2.0의 validator 노드 추가/제거

https://besu.hyperledger.org/private-networks/tutorials/ibft/validators 를 참고한다.

추가를 하려면, 예를 들어:

curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xd67073156211f895b2d4be3a86260b0554768ac0", true], "id":1}' http://127.0.0.1:8545/ -H "Content-Type: application/json"

제거를 하려면, 예를 들어:

curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xd67073156211f895b2d4be3a86260b0554768ac0", false], "id":1}' http://127.0.0.1:8545/ -H "Content-Type: application/json"

Validator 노드들은 다음과 같이 확인할 수 있다.

curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545/ -H "Content-Type: application/json"

[Python] Git 프로젝트 별 venv 사용법 정리

ChatGPT가 다음과 같이 정리 답변한다.

✅ Git 프로젝트마다 venv 만드는 법

예를 들어 my-awesome-project라는 Git 프로젝트가 있다고 가정하면:

1. 해당 프로젝트 디렉토리로 이동

cd ~/projects/my-awesome-project

2. 가상환경 만들기

python3 -m venv .venv
  • venv는 그냥 관례적으로 많이 쓰는 이름이야. 숨김 폴더가 돼서 깔끔하고, .gitignore에 넣기도 좋아.

3. 가상환경 활성화

source .venv/bin/activate
  • 프롬프트에 (venv) 또는 (.venv)처럼 표시가 붙을 거야.
  • 이 상태에서 pip install 하면 이 프로젝트 안에서만 설치돼.

4. 필요한 패키지 설치

pip install black requests flask

5. requirements.txt 만들기 (필요할 때)

pip freeze > requirements.txt
  • 다른 사람이 이 프로젝트를 클론한 다음,
pip install -r requirements.txt
  • 이렇게 하면 똑같은 환경을 바로 세팅 가능해.

✅ .gitignore 설정

venv 디렉토리는 Git에 굳이 올릴 필요 없어. 아래처럼 .gitignore에 추가해두면 좋아:

.venv/

✅ 프로젝트 폴더마다 적용 구조 예시

my-awesome-project/
├── .venv/ ← 가상환경
├── app.py
├── requirements.txt
└── README.md

🔁 다음에 다시 작업할 때는?

cd ~/projects/my-awesome-project
source .venv/bin/activate

작업 끝났으면:

deactivate

✅ VS Code 사용자라면 (추가 팁)

  • .venv를 자동으로 인식하게 하려면 .vscode/settings.json에 다음 설정 추가:
{
  "python.defaultInterpreterPath": ".venv/bin/python"
}