β Blake2bλ 무μμΈκ°?
Blake2b
λ κ³ μ, 보μμ±, μ μ°μ±μ κ°μΆ μνΈν ν΄μ ν¨μμ
λλ€.
SHA-2λ³΄λ€ λΉ λ₯΄κ³ , SHA-3λ³΄λ€ μ€μ©μ μΈ κ΅¬μ‘° λλΆμ λ€μκ³Ό κ°μ κ³³μμ λ리 μ°μ
λλ€:
- μνΈν μ§κ° (μ: Zcash, Monero)
- ν λ νΈ ν΄μ κ²μ¦ (IPFS, Dat Protocol λ±)
- ν¨μ€μλ ν΄μ/κ²μ¦ (Argon2 λ΄λΆμμ μ¬μ©)
- λ°μ΄ν° λ¬΄κ²°μ± νμΈ
- λμ§νΈ μλͺ μ μ²λ¦¬
π μ€μ μ μ© μ¬λ‘
1. Zcash: νλΌμ΄λ²μ μ€μ¬ μνΈνν
Zcashλ BLAKE2b
λ₯Ό μ£Όμ μμ±, μλͺ
, λΈλ‘μ²΄μΈ λ¬΄κ²°μ± μ²΄ν¬μ μ¬μ©ν©λλ€.
rustCopyEdituse blake2::{Blake2b, Digest};
fn hash_zcash_note(note: &[u8]) -> [u8; 32] {
let mut hasher = Blake2b::new();
hasher.update(note);
let result = hasher.finalize();
let mut hash = [0u8; 32];
hash.copy_from_slice(&result[..32]); // Blake2bλ κΈ°λ³Έμ μΌλ‘ 64λ°μ΄νΈ ν΄μ μμ±
hash
}
π μ€λͺ
: note
λ νλΌμ΄λ²μ νΈλμμ
λ°μ΄ν°μ΄λ©°, μ΄ λ°μ΄ν°λ₯Ό ν΄μ±ν΄ μμ§μμ¦λͺ
μ μ
λ ₯μΌλ‘ μ¬μ©ν©λλ€.
2. IPFS (InterPlanetary File System)
IPFSλ νμΌμ 컨ν μΈ ν΄μλ₯Ό κΈ°λ°μΌλ‘ νλ λΆμ° νμΌ μμ€ν μΌλ‘, Blake2bλ λΉ λ₯Έ ν΄μ μκ³ λ¦¬μ¦ μ΅μ μΌλ‘ μ νλ©λλ€.
bashCopyEdit# IPFS CID μμ± μ λͺ
μμ μ ν κ°λ₯
ipfs add --hash blake2b-256 somefile.txt
π‘ κΈ°λ³Έμ μΌλ‘ SHA-256μ μ°μ§λ§, νμΌμ΄ λ§κ±°λ κ²½λ νκ²½μμλ Blake2bκ° λ λΉ λ₯΄κ² λμ.
3. libsodiumμ μ΄μ©ν μΌλ°μ μ¬μ© μ
iOSλ Android μ±μμ libsodium
λλ NaCl
κ³μ΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν κ²½μ° Blake2bλ λ€μκ³Ό κ°μ΄ νΈμΆλ©λλ€.
cCopyEdit#include <sodium.h>
unsigned char hash[crypto_generichash_BYTES];
const unsigned char *message = (const unsigned char *)"Hello, world!";
size_t message_len = strlen((const char *)message);
crypto_generichash(hash, sizeof(hash),
message, message_len,
NULL, 0);
π crypto_generichash()
λ λ΄λΆμ μΌλ‘ Blake2bλ₯Ό μ¬μ©. κ°λ¨νκ³ μμ ν API μ 곡.
4. Node.jsμμ blake2b ν΄μ μ¬μ©νκΈ°
Node νκ²½μμλ blakejs
, blake2
κ°μ λͺ¨λλ‘ μ¬μ© κ°λ₯.
jsCopyEditconst blake = require('blakejs');
const input = Buffer.from("Hello, world!");
const hash = blake.blake2b(input, null, 32);
console.log(Buffer.from(hash).toString('hex'));
π λΉ λ₯Έ ν΄μκ° νμν dApp νλ‘ νΈμλ, μΉ μΈμ¦μ κ²μ¦ λ±μ μ ν©.
π μ€μ : λΉλ°λ²νΈ ν΄μμ©μΌλ‘ μ¬μ© (Argon2 λ΄μ₯)
Argon2
λ νλμ λΉλ°λ²νΈ ν΄μ μκ³ λ¦¬μ¦μ΄λ©° λ΄λΆμ μΌλ‘ Blake2b
λ₯Ό μ¬μ©ν©λλ€.
rustCopyEdituse argon2::{self, Config};
fn hash_password(password: &str, salt: &[u8]) -> String {
let config = Config::default();
argon2::hash_encoded(password.as_bytes(), salt, &config).unwrap()
}
π Blake2b
λ μ¬κΈ°μ λΉ λ₯΄κ³ μμ ν μ΄κΈ° ν€ μ€νΈλ μΉ μν μ λ΄λΉ.
β οΈ μ±λ₯ μ£Όμμ¬ν
νλ«νΌ | Blake2b νΉμ± | μ£Όμμ |
---|---|---|
x86_64 | AVX2 μ¬μ© μ λ§€μ° λΉ λ¦ | λΉλ μ SIMD μ€μ νμ |
ARM64 (iOS) | NEON μ΅μ ν μ ν | μ λ ¬ κ²½κ³ λ‘ μΈν΄ array-bounds κ²½κ³ μ°ν νμ |
WebAssembly | κΈ°λ³Έ ꡬν λΉ λ¦ | ν¬λ‘μ€ νλ«νΌ νΈνμ± μ μ§ μ 리 |
π§ͺ ν μ€νΈμ© CLI μ½λ (C)
cCopyEdit#include <sodium.h>
#include <stdio.h>
int main() {
if (sodium_init() < 0) return 1;
const char *message = "The quick brown fox jumps over the lazy dog";
unsigned char out[crypto_generichash_BYTES];
crypto_generichash(out, sizeof out,
(const unsigned char *)message, strlen(message),
NULL, 0);
for (int i = 0; i < crypto_generichash_BYTES; i++) {
printf("%02x", out[i]);
}
printf("\n");
return 0;
}
π§© ν°λ―Έλμμ λ°λ‘ μ€νν΄λ³Ό μ μλ CLI ν΄μ μ νΈλ¦¬ν° μ½λ.
π λ§λ¬΄λ¦¬: μΈμ Blake2bλ₯Ό μ°λ©΄ μ’μκΉ?
μν© | Blake2b μ ν© μ¬λΆ |
---|---|
λΉ λ₯Έ ν΄μκ° νμν κ²½μ° | β |
λΉλ°λ²νΈ ν΄μ | β (Argon2) |
λͺ¨λ°μΌ/IoT νκ²½ | β οΈ (μ λ ¬ μ£Όμ) |
λΈλΌμ°μ /Web3 νκ²½ | β |
보μ λ―Όκ°λ μ΅μ | π (SHA-3, Keccakλ κ³ λ €) |
Blake2bλ λΉ λ₯΄κ³ μμ νλ©° μ μ°ν ν΄μ μκ³ λ¦¬μ¦μ λλ€. λ¨, C/C++ κΈ°λ°μΌλ‘ μ§μ μ¬μ©ν κ²½μ° μ λ ¬ κ΄λ ¨ κ²½κ³ λ λ©λͺ¨λ¦¬ μ€λ₯λ₯Ό νΌνκΈ° μν μ»΄νμΌλ¬ μ€μ μ λ³νν΄μΌ ν©λλ€. μ΄λ₯Ό μ μ΄ν΄νκ³ νμ©νλ©΄, λμ μ±λ₯κ³Ό 보μμ λμμ ν보ν μ μμ΅λλ€.
λ΅κΈ λ¨κΈ°κΈ°