תארו לעצמכם שאתם מפעילים מאמת Ethereum, והמפתח הפרטי מאוחסן בקובץ על השרת. ניצול אחד — וכל ה-ETH המוחזק נמצא בסיכון של slashing. HSM (מודול חומרה מאובטח) פותר בעיה זו ברמת הבידוד הפיזי: המפתח נוצר ומשמש בתוך שבב מוסמך; לא ניתן לחלץ אותו. לפי מפרט PKCS#11, שום תוכנה לא יכולה לקרוא את המפתח הפרטי מה-HSM. החיסכון במעבר ל-HSM יכול להגיע ל-40-60% בהשוואה ל-KMS ענני במשך שנתיים — על ידי ביטול דמי רישוי והפחתת סיכון הדליפה. עבור כל פרויקט קריפטו המטפל בסכומים גדולים, HSM אינו מותרות אלא תקן אבטחה.
צרו קשר לקבלת ייעוץ לבחירת HSM עבור התשתית שלכם.
למה HSM עדיף על חלופות תוכנה
| מאפיין | תוכנה (קובץ/סביבה) | AWS KMS | HSM ייעודי |
|---|---|---|---|
| האם ניתן לחלץ את המפתח? | כן | לא (תיאורטית) | לא (פיזית) |
| התקפת זיכרון | פגיע | פגיע בצד הלקוח | לא (פעולות פנימיות) |
| הגנה פיזית | לא | כן (Amazon) | כן (תחת שליטתכם) |
| עדות להתערבות | לא | לא | כן (הרס עצמי בעת פתיחה) |
| רמת FIPS 140-2 | — | רמה 2 | רמה 3 או רמה 4 |
| זמן השהיה לפעולה | <1ms | 10–50ms | 5–100ms |
FIPS 140-2 רמה 3 הוא התקן למגזר הפיננסי. הוא דורש הגנה פיזית מפני התערבות (עדות להתערבות) ואימות ברמת המכשיר. רוב ה-HSM הארגוניים (Thales Luna, AWS CloudHSM, YubiHSM 2) מוסמכים לרמה זו. HSM מאובטח פי 10 מאחסון תוכנה מכיוון שהמפתח אינו נגיש פיזית.
איך לבחור HSM לבלוקצ'יין
| מכשיר | תמיכה ב-secp256k1 | תפוקה | יישום |
|---|---|---|---|
| Thales Luna Network HSM | כן | ~10 000 ECC/s | בורסות, משמורת |
| AWS CloudHSM | כן | ~1000 ECC/s | פרויקטים בענן |
| YubiHSM 2 | לא (ילידי) | ~10 ECC/s | בדיקות, מאמתים קטנים |
| Azure Dedicated HSM | כן | ~5000 ECC/s | ארגוני |
איך לשלב HSM עם Ethereum באמצעות PKCS#11
PKCS#11 הוא ממשק C תקני לעבודה עם HSM. לרוב שפות התכנות יש קישורים (bindings).
יצירת מפתח בתוך HSM
import pkcs11 from pkcs11 import Mechanism, KeyType, Attribute # Подключаемся к HSM через PKCS#11 библиотеку lib = pkcs11.lib('/usr/lib/libCryptoki2.so') # путь к вендорной библиотеке token = lib.get_token(token_label='MyHSMToken') session = token.open(user_pin='HSM_USER_PIN') # Генерируем secp256k1 ключевую пару (Ethereum/Bitcoin) # Ключи создаются и хранятся ВНУТРИ HSM, из него не выходят public_key, private_key = session.generate_keypair( KeyType.EC, public_template={ Attribute.TOKEN: True, # хранить в HSM (не только в сессии) Attribute.LABEL: 'eth-signing-key-1', Attribute.EC_PARAMS: encode_named_curve_parameters('secp256k1'), Attribute.VERIFY: True, }, private_template={ Attribute.TOKEN: True, Attribute.LABEL: 'eth-signing-key-1', Attribute.SIGN: True, Attribute.EXTRACTABLE: False, # **КРИТИЧНО**: запрет экспорта приватного ключа Attribute.SENSITIVE: True, } ) # Получаем публичный ключ (он exportable — это нормально) ec_point = public_key[Attribute.EC_POINT] # Преобразуем в Ethereum адрес eth_address = ec_point_to_eth_address(ec_point) print(f"Ethereum address: {eth_address}") חתימת עסקה באמצעות HSM
from eth_account._utils.signing import sign_transaction_dict import rlp def sign_eth_transaction_hsm(session, private_key_label, tx_dict): """ Подписываем Ethereum транзакцию ключом внутри HSM. Приватный ключ никогда не покидает HSM. """ # Кодируем транзакцию по EIP-155 (с chain_id для replay protection) chain_id = tx_dict['chainId'] unsigned_tx = encode_unsigned_tx(tx_dict) # Вычисляем хэш для подписи tx_hash = keccak256(unsigned_tx) # Получаем объект приватного ключа из HSM (не сам ключ!) private_key = session.get_key( label=private_key_label, key_type=KeyType.EC ) # Подписываем ВНУТРИ HSM — tx_hash уходит в HSM, подпись приходит обратно # Механизм ECDSA (raw) — для Ethereum нужен именно raw без хэширования внутри HSM der_signature = private_key.sign(tx_hash, mechanism=Mechanism.ECDSA) # DER -> (r, s) -> v, r, s для Ethereum r, s = decode_der_signature(der_signature) v = recover_v(tx_hash, r, s, chain_id, eth_address) signed_tx = encode_signed_tx(tx_dict, v, r, s) return signed_tx.hex() פרט חשוב: Ethereum משתמש ב-secp256k1 עם חתימה ניתנת לשחזור (רכיב import pkcs11 from pkcs11 import Mechanism, KeyType, Attribute # Подключаемся к HSM через PKCS#11 библиотеку lib = pkcs11.lib('/usr/lib/libCryptoki2.so') # путь к вендорной библиотеке token = lib.get_token(token_label='MyHSMToken') session = token.open(user_pin='HSM_USER_PIN') # Генерируем secp256k1 ключевую пару (Ethereum/Bitcoin) # Ключи создаются и хранятся ВНУТРИ HSM, из него не выходят public_key, private_key = session.generate_keypair( KeyType.EC, public_template={ Attribute.TOKEN: True, # хранить в HSM (не только в сессии) Attribute.LABEL: 'eth-signing-key-1', Attribute.EC_PARAMS: encode_named_curve_parameters('secp256k1'), Attribute.VERIFY: True, }, private_template={ Attribute.TOKEN: True, Attribute.LABEL: 'eth-signing-key-1', Attribute.SIGN: True, Attribute.EXTRACTABLE: False, # **КРИТИЧНО**: запрет экспорта приватного ключа Attribute.SENSITIVE: True, } ) # Получаем публичный ключ (он exportable — это нормально) ec_point = public_key[Attribute.EC_POINT] # Преобразуем в Ethereum адрес eth_address = ec_point_to_eth_address(ec_point) print(f"Ethereum address: {eth_address}") נדרש לשחזור המפתח הציבורי). PKCS#11 מחזיר חתימת ECDSA ללא from eth_account._utils.signing import sign_transaction_dict import rlp def sign_eth_transaction_hsm(session, private_key_label, tx_dict): """ Подписываем Ethereum транзакцию ключом внутри HSM. Приватный ключ никогда не покидает HSM. """ # Кодируем транзакцию по EIP-155 (с chain_id для replay protection) chain_id = tx_dict['chainId'] unsigned_tx = encode_unsigned_tx(tx_dict) # Вычисляем хэш для подписи tx_hash = keccak256(unsigned_tx) # Получаем объект приватного ключа из HSM (не сам ключ!) private_key = session.get_key( label=private_key_label, key_type=KeyType.EC ) # Подписываем ВНУТРИ HSM — tx_hash уходит в HSM, подпись приходит обратно # Механизм ECDSA (raw) — для Ethereum нужен именно raw без хэширования внутри HSM der_signature = private_key.sign(tx_hash, mechanism=Mechanism.ECDSA) # DER -> (r, s) -> v, r, s для Ethereum r, s = decode_der_signature(der_signature) v = recover_v(tx_hash, r, s, chain_id, eth_address) signed_tx = encode_signed_tx(tx_dict, v, r, s) return signed_tx.hex() . v (מזהה שחזור) מחושב אמפירית — נסו 0 ו-1, בדקו איזה מהם משחזר את הכתובת הנכונה.
מה זה Slashing ואיך HSM מגן על המאמת
עבור מאמתי Ethereum PoS, המפתח חותם על אישורים ובלוקים. פגיעה במפתח מובילה ל-slashing. EIP-3030 (חתימה מרחוק של Ethereum) ו-Web3Signer מ-Consensys פותרים את בעיית החתימה המרוחקת עם HSM. תצורת Web3Signer עם HSM באמצעות PKCS#11:
# web3signer конфигурация с HSM (PKCS11) type: "pkcs11-signer" pkcs11LibraryPath: "/usr/lib/softhsm/libsofthsm2.so" slashingProtectionDbUrl: "jdbc:postgresql://localhost/web3signer" keystoreFile: "/etc/web3signer/keystore.yaml" Web3Signer משתמש בנוסף במסד נתונים להגנת slashing — אם בקשת חתימה מגיעה פעמיים, השנייה תידחה. זה קריטי למניעת slashing.
ביקורת וניהול גישה
HSM מתעד כל פעולה: מי ביקש את החתימה, איזה מפתח, באיזו שעה. אלו יומנים בעלי משמעות פורנזית — יש לייצא אותם למערכת SIEM ולאחסן עם ערבויות שלמות (append-only, חתום).
סכימת בקרת גישה:
- קצין אבטחה (SO) — מנהל את ה-HSM עצמו, יוצר/מוחק מפתחות, משנה מדיניות
- מפעיל — יכול להשתמש במפתחות לחתימה אך לא יכול למחוק או לייצא אותם
- מבקר — יומנים לקריאה בלבד
הפרדת תפקידים + אימות m-of-n לפעולות SO (לדוגמה, 2 מתוך 3 כרטיסים חכמים) הוא התקן לפעולות משמורת.
גיבוי מפתחות
ניתן להעתיק מפתחות מ-HSM רק ל-HSM אחר מאותו סוג באמצעות עטיפת מפתחות (key wrapping). ההליך דורש נוכחות של קצין אבטחה וגישה פיזית. אנו מגדירים גיבוי שוטף עם הצפנה ברמת ה-HSM.
איך להגדיר HSM: מדריך שלב אחר שלב
- בחרו HSM בהתאם לדרישות לתפוקה, עקומות נתמכות וסוג פריסה (on-premise או ענן).
- התקנה פיזית ואתחול של HSM (עבור on-premise). חיבור לרשת והגדרת ניהול.
- יצירת זוגות מפתחות בתוך HSM עם פרמטרים
vו-v. - שילוב PKCS#11 עם היישום: הגדרת ספרייה, בדיקת חתימה.
- הגדרת תפקידים ואימות m-of-n לפעולות קצין אבטחה.
- שילוב עם Web3Signer לשימוש במאמת Ethereum, כולל הגדרת הגנת slashing.
- גיבוי חומר מפתחות (עטיפת מפתחות) ובדיקת תרחישי שחזור מאסון.
לתוכנית פריסה אישית, צרו קשר עם המהנדסים שלנו.
מה כלול בעבודה שלנו
- בחירת HSM לדרישות ספציפיות (on-premise לעומת ענן, תפוקה, עקומות)
- התקנה פיזית ואתחול של HSM (עבור on-premise)
- שילוב PKCS#11 עם היישום: יצירת מפתחות, פעולות חתימה
- הגדרת תפקידים ואימות m-of-n
- שילוב עם Web3Signer לתרחיש שימוש במאמת
- הגדרת יומני ביקורת עם ייצוא ל-SIEM
- נהלי גיבוי חומר מפתחות (עטיפת מפתחות ל-HSM אחר)
- בדיקת תרחישי שחזור מאסון
קבלו ייעוץ להגדרת HSM עבור הפרויקט שלכם. הזמינו יישום מפתח בידיים — אנו נאמוד לוחות זמנים ועלות באופן אישי.







