μ½ν λΌμ΄λΈλ¬λ¦¬(EntanglementLib)λ λͺ¨λ 보μ μ°μ°μ μμ νλ©°, λΉ λ₯΄κ² μ²λ¦¬νλλ‘ μ€κ³λ λΌμ΄λΈλ¬λ¦¬μ λλ€. μ°κ²°λ Rust λ μ΄μ΄(λ€μ΄ν°λΈ)λ₯Ό ν΅ν΄ κ³ μ λ° μμ-λ΄μ± μνΈν(Post-Quantum Cryptography, PQC) κΈ°μ μ μ 곡νλ©°, μ΄λ₯Ό μ¬μ©ν λ―Έλμ§ν₯μ TLS νλ‘ν μ½μ μ 곡ν©λλ€.
μ½ν λΌμ΄λΈλ¬λ¦¬λ λͺ¨λ 보μ μ°μ°μ Rust κΈ°λ° λ€μ΄ν°λΈλ₯Ό ν΅ν΄ μνν©λλ€. λ€μ΄ν°λΈμμ heap λ©λͺ¨λ¦¬ ν λΉμ λ°λ₯Έ κ°λΉμ§ 컬λ ν°(Garbage Collection, GC)μ μ²μ λ©μ»€λμ¦μμ λ°λ°λ μ μλ λͺ¨λ 보μ μ½μ μ μμ²μ μΌλ‘ λ°©μ§ν©λλ€. Java μΈ‘μ λ―Όκ° λ°μ΄ν°λ₯Ό off-heapμΌλ‘ λ°μ μμ
μ μννκ³ , νΈμΆμ λλ νΌνΈμΆμ ν¨ν΄μ ν΅ν΄ ν΄λΉ ν¬μΈν°μ λ°μ΄ν°λ₯Ό μ¦κ°μ μΌλ‘ μμ νκ² μκ±°ν©λλ€.
Java μΈ‘μμ λ€μ΄ν°λΈμ μνΈ μμ©ν λ JNI(Java Native Interface) κΈ°λ₯μ μ¬μ©νμ§ μμ΅λλ€. ν΅μ¬ κΈ°μ μ JEP 389, JEP 454 κ°μ μμ μκ±°ν κ³ κΈμ λ€μ΄ν°λΈ νΈμΆ κΈ°λ₯μΈ Linker, FFM API(Foreign Function & Memory API)μ΄λ©°, λ€μ΄ν°λΈ μΈ‘μμ μΊ‘μνλ λ‘μ§μ ν΅ν΄ FFI(Foreign Function Interface)λ‘ μ°λλ©λλ€.
Tip
λ€μ΄ν°λΈμ λν λ°°κ²½ λ° κ°μκ° κΆκΈνμλ€λ©΄ μ΄ κ³³μ μ°Έκ³ νμΈμ.
λλ μ½ν λΌμ΄λΈλ¬λ¦¬μ λ°°κ²½μ λν΄ κΆκΈνμλ€λ©΄ μ΄ κ³³μ μ°Έκ³ νμΈμ.
μ΄ λΌμ΄λΈλ¬λ¦¬ λ΄μμ μ¬μ©μμ λ°μ΄ν°λ λ°μ΄νΈ λ°°μ΄(byte[])μ΄λ λ¬Έμ λ°°μ΄(char[])λ‘ κ΄λ¦¬λμ§ μμ΅λλ€. μ΄λ¬ν νμ
μ heap λ©λͺ¨λ¦¬μ μ°κΈ°(write)λμ΄ GCμκ² μ£ΌλκΆμ μ€λλ€. μ΄λ¬ν μμμ μ¬μ© λμ SensitiveDataContainer κ°μ²΄λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄ κ°μ²΄λ λ―Όκ° λ°μ΄ν°μ μμ κΆμ λ겨λ°κ³ λ€μ΄ν°λΈμ μμ ν λ겨 μμ
μ²λ¦¬λ₯Ό μμ νκ³ ν¨μ¨μ μΌλ‘ ν μ μλλ‘ λμμ€λλ€. μ’ λ ꡬ체μ μΌλ‘, ν΄λΉ κ°μ²΄λ Rustμ RAII(Resource Acquisition Is Initialization) ν¨ν΄κ³Ό μ μ¬νκ² μΈμ€ν΄μ€ν μμ μ μμμ νλνκ³ close() νΈμΆ μμ μ μμμ ν΄μ ν©λλ€.
μ½ν λΌμ΄λΈλ¬λ¦¬λ λ©ν°λͺ¨λ νλ‘μ νΈμ λλ€. κ° λͺ¨λμ μν μ μμ λ° μ€μ©μ μ΄λ Έν μ΄μ κ³Ό κ°μ’ νΈμμ± λꡬλ₯Ό ν¬ν¨ν μ νΈλ¦¬ν°λ‘ λλ μ§λλ€. μ΄λ Έν μ΄μ λ° μ½μ΄ λͺ¨λμ 보μ λͺ¨λμμ ν΅μ¬μ μΌλ‘ μ¬μ©λμ§λ§, 보μ λͺ¨λμ λ€λ₯Έ λͺ¨λμμ μ λλ‘ μ¬μ©λμ§ μμ΅λλ€.
| λͺ¨λ | κΈ°λ₯ |
|---|---|
security |
ν΅μ¬ 보μ λͺ¨λμ λλ€. λ€μ΄ν°λΈμμ μνΈ μμ©μ μν λ‘μ§κ³Ό, FFIλ₯Ό ν΅ν΄ μ°λλ κ°κ°μ§ 보μ κΈ°λ₯μ μ 곡ν©λλ€. |
core |
μμΈ, κ΅μ ν λ° λΉλκΈ°, μ²ν¬ μμ , λ¬Έμμ΄, μλ£κ΅¬μ‘°λ₯Ό κ΄λ¦¬νλ μ νΈλ¦¬ν° κΈ°λ₯μ μ 곡ν©λλ€. |
annotations |
κ°νΈν μ½λ μ€κ³ λ° μ¬μ©μμ μ½λ μ΄ν΄ 볡μ‘λλ₯Ό κ°μ νκΈ° μν μ΄λ Έν μ΄μ μ΄ ν¬ν¨λμ΄ μμ΅λλ€. |
internal-shared-server |
νμ νκ²½μ μΈνλΌλ₯Ό νμ± λ° κ΄λ¦¬ν μ μλ κΈ°λ₯μ΄ ν¬ν¨λμ΄ μμ΅λλ€. |
μ½ν λΌμ΄λΈλ¬λ¦¬(Java)μμ λ€μ΄ν°λΈλ‘ νΈμΆλλ 보μ κΈ°λ₯(Rust)μ μνΈνμ κ²μ¦μ΄ μΆ©λΆν μ΄λ£¨μ΄μ§μ§ μμμ΅λλ€. Team Quantλ entlib-nativeμ μμ ν κ²μ¦μ μ΄λ£¨κΈ° μν΄ λ
Έλ ₯νκ³ μμ΅λλ€.
Important
μνΈ λͺ¨λμ κ²μ¦λ°λ λ°μλ λ§μ μκ°μ΄ νμν©λλ€. λ°λΌμ entlib-native 곡κΈμλ "λ°λμ μ€ν(μ°κ΅¬)μ μ©λλ‘λ§" μ¬μ©ν΄μ£ΌμΈμ.
μ¬λ¬λΆμ Rust λ μ΄μ΄μ ꡬνλ '보μ κΈ°λ₯ 곡κΈμ'λ₯Ό entlib-nativeκ° μλ, 'μ΄λ―Έ κ²μ¦λ μμ ν 곡κΈμ'λ₯Ό μ¬μ©νλλ‘ μ€μ ν μ μμ΅λλ€.
FFI κ²½κ³λ₯Ό ν΅ν΄ μ¬μ©λλ λͺ¨λ 보μ κΈ°λ₯(λ€μ΄μ μ€νΈ, μΈμ½λ©, AEAD, λμ)μ CryptoProviderConfigλ‘ λ°±μλλ₯Ό μ νν μ μμ΅λλ€. μ νμ§λ λ€μκ³Ό κ°μ΅λλ€.
CryptoBackend#JDK_VERIFIED- JDK νμ€ JCA(MessageDigest,Cipher,SecureRandom,java.util.Base64,HexFormat)λ₯Ό μ¬μ©νλ κ²μ¦λ λ°±μλ (κΈ°λ³Έκ°)CryptoBackend#ENTLIB_NATIVE-entlib-nativeFFI λ°±μλ (λ―Έκ²μ¦, μ€νμ©)- μ¬μ©μκ° μ§μ ꡬνν κ²μ¦ 곡κΈμ μΈμ€ν΄μ€ μ£Όμ (μ: HSM, PKCS#11, μ¬λ΄ κ²μ¦ λΌμ΄λΈλ¬λ¦¬)
κΈ°λ³Έκ°μ κ²μ¦λ JDK λ°±μλμ λλ€. λ°λΌμ λ³λ μ€μ μμ΄ μ΄κΈ°ννλ©΄ λ―Έκ²μ¦ λ€μ΄ν°λΈ λμ κ²μ¦λ 곡κΈμκ° μ¬μ©λ©λλ€.
// 1) κΈ°λ³Έκ° (μ 체 κ²μ¦λ JDK λ°±μλ)
EntanglementLibSecurityFacade.initialize(
EntanglementLibSecurityConfig.create(null, HeuristicArenaFactory.ArenaMode.AUTO));
// 2) μ μ + κΈ°λ₯λ³ νΌν© + μΈλΆ JCA 곡κΈμ(BouncyCastle λ±) + 컀μ€ν
곡κΈμ μ£Όμ
CryptoProviderConfig providers = CryptoProviderConfig.builder()
.useVerifiedProviders() // μ μ κΈ°λ³Έμ κ²μ¦λ JDKλ‘
.aead(CryptoBackend.ENTLIB_NATIVE) // AEADλ§ λ€μ΄ν°λΈλ‘ (μ€ν)
.jcaProviderName("BC") // κ²μ¦ λ°±μλκ° μ¬μ©ν JCA 곡κΈμλͺ
.random(myVerifiedRandomProvider) // λμλ μ¬μ©μ μ μ κ²μ¦ 곡κΈμ
.build();
EntanglementLibSecurityFacade.initialize(
EntanglementLibSecurityConfig.create(
nativeSpecContext, HeuristicArenaFactory.ArenaMode.AUTO, providers));
// 3) μ 체 entlib-native (μ€νμ©)
EntanglementLibSecurityConfig.create(nativeSpecContext, null, CryptoProviderConfig.nativeDefaults());Tip
λͺ¨λ κΈ°λ₯μ΄ κ²μ¦λ(λλ 컀μ€ν
) 곡κΈμλ‘ ν΄μλλ©΄(requiresNative() == false) μ½ν λΌμ΄λΈλ¬λ¦¬λ λ―Έκ²μ¦ λ€μ΄ν°λΈ λ°μ΄λ리λ₯Ό λ‘λνμ§ μμ΅λλ€. νμ νκ²½μμ λ€μ΄ν°λΈ λ°μ΄λ리λ₯Ό λ°°ν¬νμ§ μκ³ λ κ²μ¦λ 보μ μ°μ°λ§ μ¬μ©ν μ μμ΅λλ€.
Note
κ²μ¦λ JDK λ°±μλλ JCA νΉμ±μ μ°μ° μκ° λμ λ―Όκ° λ°μ΄ν°κ° JVM heapμ μ μ λ
ΈμΆλ©λλ€. λΌμ΄λΈλ¬λ¦¬λ μ¬μ©ν μμ byte[]λ₯Ό μ¦μ 0μΌλ‘ μκ±°νμ§λ§, μ΄λ κ²μ¦λ μ νμ±μ μν μλλ μ μΆ©μ
λλ€. λν SHAKE(XOF) κ°λ³ κΈΈμ΄ μΆλ ₯κ³Ό μμ λ€νΈμν¬ λμλ JDK νμ€μ λμμ΄ μμ΄ κ²μ¦λ λ°±μλμμ μ§μνμ§ μμ΅λλ€(λ€μ΄ν°λΈ λλ XOF μ§μ 곡κΈμ νμ).
internal-shared-server(ISS) λͺ¨λμ νμλ§μμ μ¬λ¬ λ΄λΆ λ
Έλκ° μ μνλ 보μ 곡μ μλ²μ
λλ€. κ³΅κ° μΈν°λ· CA μ λ’° 체μΈμ λ°°μ νκ³ μ¬μ 곡μ ν€(PSK)λ‘ μμΈ‘μ μνΈ μΈμ¦νλ©°, λͺ¨λ λ μ½λλ ChaCha20-Poly1305λ‘ λ³΄νΈλ©λλ€. κ²μ¦λ JDK 곡κΈμλ§μΌλ‘ λμνλ―λ‘ λ€μ΄ν°λΈ λ°μ΄λ리 λ°°ν¬ μμ΄ μ¬μ©ν μ μμ΅λλ€. μ½λλ 벨 μλ² λ API(ISSServerΒ·ISSClient)μ CLI λ κ²½λ‘λ‘ μ μ΄ν©λλ€.
Note
ν€ ν립μ DH/KEMμ μ¬μ©νμ§ μμΌλ―λ‘ μλ°©ν₯ λΉλ°μ±(PFS)μ μ 곡νμ§ μμ΅λλ€. PSKκ° λ ΈμΆλλ©΄ κ³Όκ±°Β·λ―Έλ νΈλν½μ΄ μννλ―λ‘ κ°ν PSKμ μ£ΌκΈ°μ κ΅μ²΄λ‘ μ΄μ©νμΈμ. μλ²λ κΈ°λ³Έμ μΌλ‘ 루νλ°±(127.0.0.1)μλ§ λ°μΈλνλ©°, LAN λ ΈμΆμ λͺ μμ μ΅νΈμΈ(opt-in)μ΄ νμν©λλ€.
μ ν리μΌμ΄μ λ°°ν¬λ³Έμ μμ±νλ©΄ μ€ν μ€ν¬λ¦½νΈκ° λ§λ€μ΄μ§λλ€.
./gradlew :internal-shared-server:installDist
# μμ± μμΉ
# internal-shared-server/build/install/internal-shared-server/bin/internal-shared-server
# νΈμμ alias λ±λ‘ (μ ν)
alias iss="$(pwd)/internal-shared-server/build/install/internal-shared-server/bin/internal-shared-server"λλ Gradleλ‘ λ°λ‘ μ€νν μ μμ΅λλ€.
./gradlew :internal-shared-server:run --args="--help"iss serve --port N [--bind 127.0.0.1] (--psk-file F | --psk-env VAR)
[--max-conn 64] [--allow-nonloopback] [--allow-peer IP]...
iss ping --port N [--host 127.0.0.1] (--psk-file F | --psk-env VAR)
iss put --port N [--host H] (--psk-file F | --psk-env VAR)
--key K (--value V | --value-file F | --stdin)
iss get --port N [--host H] (--psk-file F | --psk-env VAR) --key K [--out FILE]
iss del --port N [--host H] (--psk-file F | --psk-env VAR) --key K
iss list --port N [--host H] (--psk-file F | --psk-env VAR)
iss status --port N [--host H] (--psk-file F | --psk-env VAR)
iss gen-psk [--bytes 32] [--out FILE]
iss --help | --version
| λͺ λ Ή | μ€λͺ |
|---|---|
serve |
μλ²λ₯Ό λ°μΈλνκ³ μ°κ²° μμ© μμ (Ctrl-C λ‘ μ’ λ£) |
ping |
νΈλμ °μ΄ν¬ ν μλ² μλ΅ νμΈ |
put |
ν€μ κ°μ μ μ₯ (κ°μ μΈμΒ·νμΌΒ·νμ€μ λ ₯ μ€ νλ) |
get |
ν€μ κ°μ μ‘°ν (--out μ§μ μ νμΌ μ μ₯, μμΌλ©΄ νμ€μΆλ ₯, λ―Έμ‘΄μ¬ μ 1) |
del |
ν€λ₯Ό μμ |
list |
μ μ₯λ ν€ λͺ©λ‘ μΆλ ₯ |
status |
μλ² μν μ‘°ν |
gen-psk |
보μ λμλ‘ PSK μμ± (--out μμΌλ©΄ hex λ₯Ό νμ€μΆλ ₯) |
Important
PSKλ νλ¬Έ λͺ
λ Ήν μΈμλ‘ λ°μ§ μμ΅λλ€(νλ‘μΈμ€ λͺ©λ‘ λ
ΈμΆ λ°©μ§). raw λ°μ΄νΈ ν€ νμΌ(--psk-file) λλ hex νκ²½λ³μ(--psk-env)λ‘λ§ μ
λ ₯νλ©°, μ΅μ 32λ°μ΄νΈλ₯Ό μꡬν©λλ€. λ‘κ·Έλ νμ€μ€λ₯λ‘, λͺ
λ Ή κ²°κ³Ό λ°μ΄ν°λ νμ€μΆλ ₯μΌλ‘ λΆλ¦¬λ©λλ€.
# 1) PSK μμ± (raw 32λ°μ΄νΈ ν€ νμΌ, μμ μ μ μ© κΆνμΌλ‘ μ μ₯)
iss gen-psk --out infra.psk
# 2) μλ² κΈ°λ (루νλ°± κΈ°λ³Έ)
iss serve --port 8443 --psk-file infra.psk
# 3) λ€λ₯Έ ν°λ―Έλμμ ν΄λΌμ΄μΈνΈ λͺ
λ Ή
iss ping --port 8443 --psk-file infra.psk
iss put --port 8443 --psk-file infra.psk --key greeting --value "Hello"
iss get --port 8443 --psk-file infra.psk --key greeting
iss list --port 8443 --psk-file infra.psk
iss status --port 8443 --psk-file infra.psk
iss del --port 8443 --psk-file infra.psk --key greeting
# νκ²½λ³μ(hex)λ‘ PSK μ λ¬
export ISS_PSK=$(iss gen-psk)
iss ping --port 8443 --psk-env ISS_PSKμ¬λ¬λΆμ νΌλλ°±μ μ κ·Ήμ μΌλ‘ λ°μ μ€λΉκ° λμ΄ μμ΅λλ€. μ½ν λΌμ΄λΈλ¬λ¦¬λ λ¨μν PQC μκ³ λ¦¬μ¦μ μ 곡νλ κ²λ§μ΄ μλ, 체κ³μ μΌλ‘ μ¬μ©μ νκ²½μ μΈνλΌ λ³΄μμ κ°μνκ³ μ¬μ©μμκ² ν΄κ²°μ± μ μ°Ύμμ£Όλ μ λ₯ν λꡬλ‘μ¨ μ¬μ©λλλ‘ κ°λ°λ©λλ€. μ΅μ 릴리μ¦λΆν΄ μ΄ μ λ μ κ°λ ₯ν μ΄μ μ λ§μΆ κ²μ λλ€.
μ½ν λΌμ΄λΈλ¬λ¦¬λ λ―Έλμ κΈμ΅ λ° λ³΄μ μΈνλΌ νλ‘λμ μμ μ¬μ©ν μ μλλ‘ λ€μμ TODOλ₯Ό λͺ νν νκ³ μ ν©λλ€.
- νμλ§ νκ²½ μ μ©ν μ¬μ©μ μν Local Hosted μΉ κ°λ°
- νμ¬ ISSλ CLIμ μλ² λ API(
ISSServerΒ·ISSClient)λ‘λ§ μ μ΄ν©λλ€. μΉ κΈ°λ° κ΄λ¦¬ μ½μμ μμ§ μμ΅λλ€.
- νμ¬ ISSλ CLIμ μλ² λ API(
- TLS ν΅μ λ‘μ§ μΆκ°
- ISSμ PSK μνΈ μΈμ¦ + ChaCha20-Poly1305 보μ μ±λμ ꡬνμ μλ£νμ΅λλ€.
securityλͺ¨λμExternalTLSνμ¬λ 골격μ μΆκ°νμΌλ, ML-KEM ν€ ν립과 ChaCha20-Poly1305 λ μ½λ AEAD, RNG nonce μμ±μ΄ λ€μ΄ν°λΈ FFIμ λ ΈμΆλκΈ° μ κΉμ§ νΈλμ °μ΄ν¬λ λΉνμ±(μ€ν ) μνμ λλ€.
- λ³΅ν© κ²μ¦ μμ
μ€λΉ λ° μν
- 보μ 곡κΈμ SPI(
CryptoProviderConfig)λ₯Ό μΆκ°ν΄ λ―Έκ²μ¦ λ€μ΄ν°λΈ λμ κ²μ¦λ JDK 곡κΈμ(λλ 컀μ€ν 곡κΈμ)λ₯Ό μ νν μ μμ΅λλ€.entlib-nativeμ체μ μνΈνμ κ²μ¦μ κ³μ μ§ν μ€μ λλ€.
- 보μ 곡κΈμ SPI(
- 컀μ€ν
μμΈ μ΅μ ν
- checked/unchecked λ° core/security κ³μΈ΅μΌλ‘ λΆλ¦¬ν μμΈ μ²΄κ³μ i18n μ°λ
ExceptionLoggerλ₯Ό ꡬμ±νμ΅λλ€.
- checked/unchecked λ° core/security κ³μΈ΅μΌλ‘ λΆλ¦¬ν μμΈ μ²΄κ³μ i18n μ°λ
- JPMS μ μ© (λ©ν°λͺ¨λ λ΄μμλ ν¨ν€μ§ λͺ¨λν)
- μμ ν μΊ‘μνμ μΌκ΄λ νΈμΆ(λλ μ¬μ©) ν¨ν΄μ΄ μμ±λλ©΄ JPMSλ₯Ό ν΅ν΄ μΊ‘μνλ ν¨ν€μ§λ₯Ό λͺ¨λλ‘μ κ΄λ¦¬νλ €κ³ ν©λλ€.
- μΈλΆ μμ‘΄μ± μ΅μν
1.1.0릴리μ¦λΆν΄BouncyCastleμμ‘΄μ±μ μ¬μ©νμ§ μμΌλ©°,Lombokμμ‘΄μ±λ μ κ±°νμ΅λλ€. νμ¬ μ½λ μμ±μ νμν λͺ κ°μ§ μ μ©ν λꡬλ₯Ό μ 곡νλ μμ‘΄μ±μ μ¬μ ν λ¨μ μμ§λ§, μ΄λ€λ λλ΄ μ΅μνλ μμ μ λλ€.
-
i18nμ λ°μ΄νΈcoreμEntanglementLibCoreI18nκ³Όen_USΒ·ko_KRλ©μμ§ λ²λ€μ κ°μ·μ΅λλ€. λ€λ§ κ΅¬μ± μ€μ μ λ°λΌ κ° μΈμ΄λ³ λ‘κΉ μ μλ μ μ©νλ μ°λμ μμ§ λ λ€λ¬μ΄μΌ ν©λλ€.
λ³Έ νλ‘μ νΈλ PolyForm Noncommercial License 1.0.0μ λ°λ¦
λλ€. μ΄ νλ‘μ νΈ λ΄μμ entlib-nativeλ₯Ό λμ κ΄λ¦¬νλ νμ λΌμ΄μ μ€κ° κ°λ MITλ‘ μλͺ» λ°μλ λκ° μμ§λ§, μ¬μ ν PolyForm λΌμ΄μ μ€λ₯Ό λ°λ₯Έλ€λ κ²μ μ°Έκ³ ν΄μ£ΌμΈμ. μ΄ λΌμ΄μ μ€μ κ΄ν΄ μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έκ³ νμΈμ.
λ³κ²½ μ¬νμ CHANGE.md λ¬Έμμμ νμΈνμ€ μ μμ΅λλ€. μ΄ λ¬Έμλ 1.1.0 릴리μ¦κ° 곡κ°λ λ μΆκ°λ©λλ€.
