Maison  >  Article  >  développement back-end  >  Services cachés persistants dans Golang

Services cachés persistants dans Golang

WBOY
WBOYavant
2024-02-09 12:33:09881parcourir

Services cachés persistants dans Golang

L'éditeur PHP Xinyi vous emmènera explorer les services cachés persistants de Golang. Golang est un langage de programmation efficace connu pour ses excellentes performances et sa concurrence. À l’ère d’Internet où tout va très vite, les services cachés sont devenus une partie importante de nombreuses applications. Ils offrent un moyen sûr et fiable de faire fonctionner les applications pendant de longues périodes tout en masquant leurs informations internes. Cet article présentera comment implémenter des services cachés persistants dans Golang et explorera ses scénarios d'application et ses avantages dans des applications pratiques. Que vous soyez débutant ou développeur expérimenté, vous acquerrez des connaissances utiles et une expérience pratique. Explorons ensemble ce sujet intéressant !

Contenu de la question

J'essaie d'héberger un service caché dans Golang en utilisant github.com/cretz/bine/tor. Mais chaque fois que je démarre le programme, un nouveau service caché (avec une nouvelle adresse .onion) est démarré à la place du service caché précédent.

C'est le code que j'utilise

package main

import (
    "context"
    "fmt"
    "github.com/cretz/bine/tor"
    "log"
    "net/http"
    "time"
)

func main() {
    // Start tor with default config
    fmt.Println("Starting and registering onion service, please wait a couple of minutes...")
    t, err := tor.Start(nil, nil)
    if err != nil {
        log.Panicf("Unable to start Tor: %v", err)
    }
    defer t.Close()
    // Wait at most a few minutes to publish the service
    listenCtx, listenCancel := context.WithTimeout(context.Background(), 3*time.Minute)
    defer listenCancel()
    // Create a v3 onion service
    onion, err := t.Listen(listenCtx, &tor.ListenConf{Version3: true, RemotePorts: []int{80}})
    if err != nil {
        log.Panicf("Unable to create onion service: %v", err)
    }
    defer onion.Close()
    fmt.Printf("Open Tor browser and navigate to http://%v.onion\n", onion.ID)
    fmt.Println("Press enter to exit")
    // Serve the current folder from HTTP
    errCh := make(chan error, 1)
    go func() { errCh <- http.Serve(onion, http.FileServer(http.Dir("."))) }()
    // End when enter is pressed
    go func() {
        fmt.Scanln()
        errCh <- nil
    }()
    if err = <-errCh; err != nil {
        log.Panicf("Failed serving: %v", err)
    }
}


J'ai essayé de forcer le programme à utiliser le même DataDir

t, err := tor.Start(nil, &tor.StartConf{DataDir: "data-dir"})

Mais ça ne marche pas.

Solution de contournement

Vous devez créer et stocker une clé, puis la transmettre à ListenConf :

Voir : https://github.com/cretz/bine/blob/master/tor/listen.go#L56

Remarque :

La bibliothèque que vous utilisez fournit des fonctions pour ce faire.

Voir : https://github.com/cretz/bine/blob/b9d31d9c786616742e39a121b60522e803e96731/torutil/ed25519/ed25519.go#L132

Faites cela une fois et enregistrez privateKeyString :

keyPair, _ := ed25519.GenerateKey()
privateKeyString := hex.EncodeToString(keyPair.PrivateKey())

Puis dans votre code serveur :

privateKeyBytes, _ := hex.DecodeString(privateKeyString)
privateKey := ed25519.PrivateKey(privateKeyBytes)
lc := &tor.ListenConf{
    Key: privateKey,
    Version3: true,
    RemotePorts: []int{80}
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer