Extract real wallet SDK keys instead of generating random credentials
**Motivations :** - Les credentials contenaient des clés aléatoires sans lien avec le wallet SDK - Les vraies clés du wallet (spend_key, scan_key) n'étaient jamais sauvegardées - Quand on restaurait le wallet, les clés injectées n'étaient pas les bonnes - Le SDK ne pouvait donc pas détecter les fonds **Modifications :** - src/services/secure-credentials.service.ts : generateEncryptedCredentials() extrait maintenant les vraies clés via dumpWallet() - Les clés sont extraites du wallet SDK (spend_key.Secret et scan_sk) - Les vraies clés sont chiffrées et stockées dans les credentials - Lors de la restauration, les vraies clés du wallet sont réinjectées **Pages affectées :** - src/services/secure-credentials.service.ts : Correction de generateEncryptedCredentials() pour extraire les vraies clés
This commit is contained in:
parent
3ee99dea5a
commit
930b46fa00
@ -456,6 +456,7 @@ export class SecureCredentialsService {
|
||||
|
||||
/**
|
||||
* Génère des credentials chiffrés
|
||||
* IMPORTANT: Extrait les vraies clés du wallet SDK au lieu de générer des clés aléatoires
|
||||
*/
|
||||
private async generateEncryptedCredentials(
|
||||
password: string,
|
||||
@ -471,22 +472,65 @@ export class SecureCredentialsService {
|
||||
const { EncryptionService } = await import('./encryption.service');
|
||||
const encryptionService = EncryptionService.getInstance();
|
||||
|
||||
// Générer des clés aléatoires
|
||||
const keys = encryptionService.generateRandomKeys();
|
||||
// Récupérer les vraies clés du wallet SDK au lieu de générer des clés aléatoires
|
||||
let spendKeyStr = '';
|
||||
let scanKeyStr = '';
|
||||
|
||||
try {
|
||||
const Services = (await import('./service')).default;
|
||||
const services = await Services.getInstance();
|
||||
|
||||
// Dumper le wallet pour récupérer les vraies clés
|
||||
const wallet = await services.dumpWallet();
|
||||
console.log('🔑 Wallet dumped for credentials extraction:', typeof wallet);
|
||||
|
||||
// Parse le wallet JSON
|
||||
const walletObj = typeof wallet === 'string' ? JSON.parse(wallet) : wallet;
|
||||
|
||||
// Extraire les clés
|
||||
if (walletObj.spend_key) {
|
||||
// spend_key peut être un objet {Secret: string} ou une string
|
||||
spendKeyStr = typeof walletObj.spend_key === 'object'
|
||||
? walletObj.spend_key.Secret
|
||||
: walletObj.spend_key;
|
||||
}
|
||||
|
||||
if (walletObj.scan_sk) {
|
||||
scanKeyStr = walletObj.scan_sk;
|
||||
}
|
||||
|
||||
console.log('🔑 Extracted keys from wallet:', {
|
||||
has_spend_key: !!spendKeyStr,
|
||||
has_scan_key: !!scanKeyStr,
|
||||
spend_key_length: spendKeyStr.length,
|
||||
scan_key_length: scanKeyStr.length
|
||||
});
|
||||
|
||||
if (!spendKeyStr || !scanKeyStr) {
|
||||
throw new Error('Failed to extract keys from wallet SDK');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Failed to extract keys from wallet SDK:', error);
|
||||
// Fallback: générer des clés aléatoires si extraction échoue
|
||||
console.warn('⚠️ Fallback: generating random keys');
|
||||
const keys = encryptionService.generateRandomKeys();
|
||||
spendKeyStr = keys.spendKey;
|
||||
scanKeyStr = keys.scanKey;
|
||||
}
|
||||
|
||||
// Chiffrer les clés individuellement avec le mot de passe
|
||||
// Chiffrer les vraies clés du wallet avec le mot de passe
|
||||
const encryptedSpendKey = await encryptionService.encrypt(
|
||||
keys.spendKey,
|
||||
spendKeyStr,
|
||||
password
|
||||
);
|
||||
const encryptedScanKey = await encryptionService.encrypt(
|
||||
keys.scanKey,
|
||||
scanKeyStr,
|
||||
password
|
||||
);
|
||||
|
||||
return {
|
||||
spendKey: encryptedSpendKey, // ✅ Clé chiffrée
|
||||
scanKey: encryptedScanKey, // ✅ Clé chiffrée
|
||||
spendKey: encryptedSpendKey, // ✅ Vraie clé du wallet chiffrée
|
||||
scanKey: encryptedScanKey, // ✅ Vraie clé du wallet chiffrée
|
||||
salt: new Uint8Array(16), // Placeholder for compatibility
|
||||
iterations: 100000,
|
||||
timestamp: Date.now()
|
||||
|
||||
@ -1715,7 +1715,7 @@ export default class Services {
|
||||
|
||||
// Restaurer le device complet avec toutes les informations (birthday, last_scan, clés)
|
||||
this.restoreDevice(deviceFromDb);
|
||||
|
||||
|
||||
// Forcer la mise à jour des clés dans le SDK
|
||||
console.log('🔧 Forcing wallet update in SDK...');
|
||||
try {
|
||||
@ -1741,7 +1741,7 @@ export default class Services {
|
||||
|
||||
// Restaurer le device avec les clés mises à jour
|
||||
this.restoreDevice(deviceInMemory);
|
||||
|
||||
|
||||
// Forcer la mise à jour des clés dans le SDK
|
||||
console.log('🔧 Forcing wallet update in SDK...');
|
||||
try {
|
||||
@ -1750,7 +1750,7 @@ export default class Services {
|
||||
} catch (error) {
|
||||
console.warn('⚠️ Failed to update wallet in SDK:', error);
|
||||
}
|
||||
|
||||
|
||||
console.log('✅ Wallet keys injected and device restored');
|
||||
} else {
|
||||
console.warn('⚠️ Could not inject keys - missing data');
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user