Išpilstymo pasitikėjimas: kaip gamintojai gali naudoti QR kodus, kad pašalintų netikrus gėrimus

Išpilstymo pasitikėjimas: kaip gamintojai gali naudoti QR kodus, kad pašalintų

Įsivaizduokite taip: ruošiatės mėgautis mėgstamu gėrimu, bet kyla erzinančių abejonių – ar tai tikras dalykas? Padirbti gėrimai yra daugiau nei tik nepatogumas; tai pasaulinė problema, kainuojanti milijardus ir galinti kelti pavojų vartotojų sveikatai. Bet ką daryti, jei yra paprastas techninis sprendimas, kuris galėtų nuraminti mūsų mintis? Įeikite į QR kodo gėrimų patvirtinimo pasaulį.

Šiame straipsnyje mes pasinersime į žaidimą keičiantį metodą, kurį teisėti gėrimų gamintojai gali naudoti kovodami su padirbtais produktais. Tai ne apie įmantrius įtaisus vartotojų rankose – tai apie gamintojų įgalinimą suteikti kiekvienam buteliukui unikalų, nuskaitomą tapatybę.

Nesijaudinkite, jei nesate išmanantis technologijas; Šį sprendimą išskaidysiu paprasta anglų kalba. O tiems, kurie mėgsta dirbti su kodu, pateiksiu keletą techninių detalių, kurios paskatins jūsų susidomėjimą.

Didėjanti padirbtų gėrimų grėsmė

Prieš tyrinėdami sprendimą, supraskime problemos apimtį. Padirbti gėrimai yra svarbi ir auganti problema, ypač tokiose šalyse kaip Nigerija:

Šios problemos pasekmės apima ne tik ekonominius nuostolius. Sveikatos ekspertai perspėja, kad padirbti gėrimai padidina kepenų ir širdies ir kraujagyslių ligų riziką, todėl pabrėžia, kad reikia skubiai ieškoti veiksmingų sprendimų.

Kaip tai veikia

Išskaidykime QR kodo patvirtinimo sistemos procesą:

  1. Gamintojai kiekvienam buteliui sukuria unikalų QR kodą.
  2. Šis kodas saugomas saugioje centrinėje duomenų bazėje.
  3. QR kodas pritvirtintas po kamščiu arba ant butelio plombos.
  4. Vartotojai nuskaito kodą savo išmaniaisiais telefonais.
  5. Nuskaitymas nukreipia juos į gamintojo patvirtintą domeną.
  6. Svetainėje pateikiami gamybos duomenys ir autentiškumo patvirtinimas.

Štai vizualinis sistemos vaizdas:

MANUFACTURER                     BOTTLE                     CONSUMER
         |                               |                           |
     1.(Generate QR)                     |                           |
         |                               |                           |
     2.(Store in DB)                     |                           |
         |                               |                           |
         |------------------------------>|                           |
     3.(Attach QR under cork/seal)       |                           |
         |                               |                           |
         |                               |    4.(Purchase Bottle)    |
         |                               |<--------------------------|
         |                               |                           |
         |                               |    5.(Scan QR Code)       |
         |                               |<--------------------------|
         |                               |                           |
         |<------------------------------------------------------------
         |              6.(Send Verification Request)                |
         |                                                           |
    7.(Check DB)                                                     |
         |                                                           |
         |------------------------------------------------------------>
         |        8.(Display Verification on Official Domain)        |
         |                                                           |
         |                               |                           |
         |                               |9.(View Verification Info) |
         |                               |    - Production Date      |
         |                               |    - Production Time      |
         |                               |    - Manager Signature    |
         |                               |                           |
 10.(Confirm Authentic!)                 |                           |

Privalumai ir iššūkiai

Privalumai

  • Patobulintas autentifikavimas: kiekvienas butelis gauna unikalų identifikatorių, o tai žymiai sumažina didelio masto padirbinėjimo galimybę.
  • Vartotojų įgalinimas: pirkėjai gali lengvai patikrinti savo pirkinių autentiškumą naudodami savo išmaniuosius telefonus.
  • Tikrinimas realiuoju laiku: sistema užtikrina momentinį autentifikavimą, potencialiai sulaikydama padirbtus gaminius pardavimo vietoje.
  • Patobulintas atsekamumas: Gamybos detalės leidžia geriau kontroliuoti kokybę ir valdyti tiekimo grandinę.
  • Prekės ženklo apsauga: gamintojai gali geriau apsaugoti savo reputaciją ir pajamas.

Iššūkiai

  • Diegimo išlaidos: sistemos nustatymas gali būti brangus, ypač mažesniems gamintojams.
  • Nuolatinė priežiūra: Nuolatinė priežiūra ir patikimos saugumo priemonės reikalauja daug išteklių.
  • Vartotojų priėmimas: sistemos efektyvumas priklauso nuo to, ar vartotojai iš tikrųjų nuskaito kodus.
  • Technologinės kliūtys: ne visi vartotojai gali turėti išmaniuosius telefonus arba būti patenkinti QR kodais.
  • Saugumo rizika: netinkamai apsaugoti QR kodai gali būti nukopijuoti arba sugadinti.

Techninė pusė: įgyvendinimas naudojant „Go“.

Dabar pasinerkime į techninį įgyvendinimą. Šiam projektui pasirinkau „Go“ („Golang“) dėl didelio našumo, puikaus lygiagrečio palaikymo ir gebėjimo kasdien generuoti milijonus QR kodų.

Kodėl eiti?

  1. Didelis našumas: Idealiai tinka dideliems QR kodų kiekiams generuoti ir tikrinti.
  2. Lygiagretumas: Go gorutinos leidžia lengvai įgyvendinti vienu metu vykdomas operacijas.
  3. Stipri standartinė biblioteka: Apima integruotus HTTP serverius ir kriptografines funkcijas.
  4. Kompiliacija: Kompiliuojamas į vieną dvejetainį failą, supaprastindamas diegimą.
  5. Duomenų bazės palaikymas: Puikios įvairių duomenų bazių tvarkyklės.
  6. Apsaugos funkcijos: Mažiau linkę į tam tikrų tipų saugumo spragas.

Pagrindiniai komponentai

Išskirkime pagrindinius „Go“ diegimo komponentus:

1. QR kodo generavimas su šifravimu

package main
 
import (
	"bytes"
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/base64"
	"fmt"
	"image/png"
	"io"
	"strings"
	"time"
 
	"encoding/hex"
 
	"github.com/boombuler/barcode"
	"github.com/boombuler/barcode/qr"
)
 
var secretKey = ()byte("a-32-byte-secret-key-for-aes-256") // Must be 32 bytes for AES-256
 
func encrypt(plaintext string) (string, error) {
	block, err := aes.NewCipher(secretKey)
	if err != nil {
		return "", err
	}
 
	ciphertext := make(()byte, aes.BlockSize+len(plaintext))
	iv := ciphertext(:aes.BlockSize)
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return "", err
	}
 
	stream := cipher.NewCFBEncrypter(block, iv)
	stream.XORKeyStream(ciphertext(aes.BlockSize:), ()byte(plaintext))
 
	return base64.URLEncoding.EncodeToString(ciphertext), nil
}
 
func decrypt(ciphertext string) (string, error) {
	data, err := base64.URLEncoding.DecodeString(ciphertext)
	if err != nil {
		return "", err
	}
 
	block, err := aes.NewCipher(secretKey)
	if err != nil {
		return "", err
	}
 
	if len(data) < aes.BlockSize {
		return "", fmt.Errorf("ciphertext too short")
	}
	iv := data(:aes.BlockSize)
	data = data(aes.BlockSize:)
 
	stream := cipher.NewCFBDecrypter(block, iv)
	stream.XORKeyStream(data, data)
 
	return string(data), nil
}
 
func base64ToImg(code barcode.Barcode) (string, error) {
	// Create a buffer to hold the PNG image
	var buf bytes.Buffer
 
	// Encode the barcode as a PNG image and write it to the buffer
	if err := png.Encode(&buf, code); err != nil {
		return "", err
	}
 
	// Encode the buffer's content as a base64 string
	return base64.StdEncoding.EncodeToString(buf.Bytes()), nil
}
 
func generateUniqueID() string {
	// Generate a random 16-byte slice
	b := make(()byte, 16)
	_, err := rand.Read(b)
	if err != nil {
		// Handle error
		return ""
	}
 
	// Convert the byte slice to a hex-encoded string
	return hex.EncodeToString(b)
}
 
 
func generateQRCode(product, location, supervisor string) (string, string, error) {
	currentTime := time.Now().Format(time.RFC3339)
	data := fmt.Sprintf("%s - %s - %s - %s", product, currentTime, location, supervisor)
 
	// Encrypt the data
	encryptedData, err := encrypt(data)
	if err != nil {
		return "", "", fmt.Errorf("encryption error: %v", err)
	}
 
	// Generate a unique identifier
	uniqueID := generateUniqueID()
 
	// Combine the unique ID and encrypted data
	qrContent := fmt.Sprintf("%s|%s", uniqueID, encryptedData)
 
	// Generate QR code with the combined content
	qrCode, err := qr.Encode(qrContent, qr.M, qr.Auto)
	if err != nil {
		return "", "", fmt.Errorf("QR code generation error: %v", err)
	}
 
	qrCode, err = barcode.Scale(qrCode, 200, 200)
	if err != nil {
		return "", "", fmt.Errorf("QR code scaling error: %v", err)
	}
 
	// Convert to base64 for storage
	base64Img, err := base64ToImg(qrCode)
	if err != nil {
		return "", "", fmt.Errorf("QR code image encoding error: %v", err)
	}
 
	return qrContent, base64Img, nil
}
 
func main() {
	tests := ()struct {
		product    string
		location   string
		supervisor string
	}{
		{"VSOP", "Victoria Island Manufacturing Unit 4 Lagos", "Samuel Ladapo"},
		{"VSOP", "Victoria Island Manufacturing Unit 4 Lagos", "Jane Doe"},
		{"VSOP", "Victoria Island Manufacturing Unit 3 Lagos", "John Smith"},
	}
 
	for _, test := range tests {
		fmt.Printf("Generating QR code for Product: %s, Location: %s, Supervisor: %s\n", test.product, test.location, test.supervisor)
 
		qrContent, qrCodeImg, err := generateQRCode(test.product, test.location, test.supervisor)
		if err != nil {
			fmt.Println("Error generating QR code:", err)
			continue
		}
 
		fmt.Println("Generated QR Code (Base64 Image):", qrCodeImg)
 
		// Decrypt the QR code content
		parts := strings.SplitN(qrContent, "|", 2)
		if len(parts) != 2 {
			fmt.Println("Invalid QR code format")
			continue
		}
 
		encryptedData := parts(1)
		decryptedData, err := decrypt(encryptedData)
		if err != nil {
			fmt.Println("Error decrypting QR code data:", err)
			continue
		}
 
		fmt.Println("Decrypted Data:", decryptedData)
		fmt.Println()
	}
}

Išvesties pavyzdys:

➜  drinks go run main.go
Generating QR code for Product: VSOP, Location: Victoria Island Manufacturing Unit 4 Lagos, Supervisor: Samuel Ladapo
Generated QR Code (Base64 Image): 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
Decrypted Data: VSOP - 2024-08-28T14:40:20+01:00 - Victoria Island Manufacturing Unit 4 Lagos - Samuel Ladapo
 
Generating QR code for Product: VSOP, Location: Victoria Island Manufacturing Unit 4 Lagos, Supervisor: Jane Doe
Generated QR Code (Base64 Image): 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
Decrypted Data: VSOP - 2024-08-28T14:40:20+01:00 - Victoria Island Manufacturing Unit 4 Lagos - Jane Doe
 
Generating QR code for Product: VSOP, Location: Victoria Island Manufacturing Unit 3 Lagos, Supervisor: John Smith
Generated QR Code (Base64 Image): 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
Decrypted Data: VSOP - 2024-08-28T14:40:20+01:00 - Victoria Island Manufacturing Unit 3 Lagos - John Smith

Ši funkcija užšifruoja produkto informaciją, sugeneruoja unikalų identifikatorių ir sukuria QR kodą, kuriame yra abu.

2. Internetinis patvirtinimas

Vartotojo įrenginyje jie nuskaito QR kodą savo išmaniojo telefono kamera, o sistema patikrina prekės autentiškumą. Kai jie nuskaito QR kodą, jie nukreipiami į gamintojo patvirtintą domeną, pvz https://hennessy.com/verify?content=uniqueID.

// Assume these functions are defined elsewhere in your code
func checkUniqueIDExists(uniqueID string) (bool, error) {
	// Implementation to check if the unique ID exists in the database
}
 
func markUniqueIDAsUsed(uniqueID string) error {
	// Implementation to mark the unique ID as used in the database
}
 
func verifyQRCode(w http.ResponseWriter, r *http.Request) {
	qrContent := r.URL.Query().Get("content")
	parts := strings.Split(qrContent, "|")
	if len(parts) != 2 {
		http.Error(w, "Invalid QR code format", http.StatusBadRequest)
		return
	}
 
	uniqueID, encryptedData := parts(0), parts(1)
 
	// Verify the unique ID exists in the database
	exists, err := checkUniqueIDExists(uniqueID)
	if err != nil {
		http.Error(w, "Database error", http.StatusInternalServerError)
		return
	}
	if !exists {
		http.Error(w, "Invalid or used QR code", http.StatusNotFound)
		return
	}
 
	// Decrypt the data
	decryptedData, err := decrypt(encryptedData)
	if err != nil {
		http.Error(w, "Decryption error", http.StatusInternalServerError)
		return
	}
 
	// Mark the unique ID as used in the database
	err = markUniqueIDAsUsed(uniqueID)
	if err != nil {
		log.Printf("Error marking unique ID as used: %v", err)
	}
 
	// Return the verification result
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map(string)string{
		"status": "verified",
		"data":   decryptedData, // The decrypted product information e.g "Drinks - 2023-01-01 - Victoria Island Manufacturing Unit 1 Lagos - Samuel Ladapo"
	})
}

Ši funkcija atlieka patvirtinimo procesą, patikrina unikalų ID, iššifruoja duomenis ir grąžina rezultatą.

3. Lygiagreti karta

Tais atvejais, kai reikia sugeneruoti daug QR kodų, galime naudoti „Go“ lygiagretumo galimybes, kad pagreitintume apdorojimą. Štai pavyzdys, kaip vienu metu galime generuoti milijonus QR kodų:

Pavyzdžiui, norėdami sugeneruoti iki 2 milijonų QR kodų ir efektyviai juos saugoti duomenų bazėje, turite užtikrinti, kad duomenų bazės operacijos būtų tvarkomos vienu metu ir efektyviai. Čia yra visa funkcija su kai kuriais patobulinimais: naudokite buferinį kanalą, kad apribotumėte lygiagrečių gorutinų skaičių. Norėdami pagerinti našumą, naudokite operaciją paketų įterpimo operacijoms.

func generateQRCodes(w http.ResponseWriter, r *http.Request) {
	count := 2000000 // Number of QR codes to generate
	var wg sync.WaitGroup
	concurrencyLimit := 1000 // Limit the number of concurrent goroutines
	sem := make(chan struct{}, concurrencyLimit)
 
	for i := 0; i < count; i++ {
		wg.Add(1)
		sem <- struct{}{} // Acquire a token
 
		go func(i int) {
			defer wg.Done()
			defer func() { <-sem }() // Release the token
 
			product := fmt.Sprintf("Product%d", i)
			location := "Factory A"
			supervisor := "John Doe"
			qrContent, qrCodeImg, err := generateQRCode(product, location, supervisor)
			if err != nil {
				log.Printf("Error generating QR code: %v", err)
				return
			}
 
			uniqueID := fmt.Sprintf("PROD%d", time.Now().UnixNano())
 
			// Store in database
			_, err = db.Exec("INSERT INTO products (unique_id, qr_code) VALUES ($1, $2)", uniqueID, qrCodeImg)
			if err != nil {
				log.Printf("Error storing in database: %v", err)
			}
		}(i)
	}
 
	wg.Wait()
	fmt.Fprintf(w, "Generated %d QR codes", count)
}

Ši funkcija demonstruoja „Go“ lygiagretumo galimybes, vienu metu generuodama milijonus QR kodų.

Saugumo svarstymai

  • Visiems žiniatinklio ryšiams naudokite HTTPS.
  • Įdiekite tikrinimo galutinio taško dažnio ribojimą.
  • Naudokite saugaus rakto valdymo praktiką, galbūt įtraukdami aparatūros saugos modulius (HSM).
  • Reguliariai keiskite šifravimo raktus.
  • Tvarkykite išsamius audito žurnalus.
  • Užtikrinkite tinkamą duomenų bazės saugumą ir atsargines kopijas.
  • Įdiekite griežtą įvesties patvirtinimą, kad išvengtumėte bendrų pažeidžiamumų.

Realaus pasaulio poveikis

Šios sistemos įgyvendinimas gali turėti didelių realių pasekmių:

  1. Vartotojų apsauga: padeda apsaugoti vartotojus nuo galimai žalingų padirbtų gėrimų.
  2. Prekės ženklo apsauga: padirbinėtojams žymiai sunkiau įtikinamai atkartoti gaminius.
  3. Teisėsaugos pagalba: padeda atpažinti ir sekti padirbinėjimo operacijas.
  4. Ekonominis poveikis: remia teisėtą verslą ir potencialiai padidina mokestines pajamas iš legalaus pardavimo.
  5. Visuomenės sveikata: vaidina svarbų vaidmenį saugant visuomenės sveikatą, sumažindamas potencialiai pavojingų padirbtų gėrimų apyvartą.

Išvada

Šis „Go“ pagrindu sukurtas diegimas su užšifruotais QR kodais ir žiniatinklio patvirtinimo sistema yra efektyvus ir saugus sprendimas kovojant su padirbtais gėrimais. Naudodami „Go“ funkcijas, kasdien galime generuoti milijonus unikalių užšifruotų QR kodų, kurių kiekvienas yra susietas su konkrečia produkto informacija.

Nors vien technologija negali visiškai išnaikinti padirbtų gėrimų problemos, ši sistema yra didelė kliūtis padirbinėtojams. Tai įgalina gamintojus ir vartotojus kovoti su padirbtais gėrimais, gali išgelbėti gyvybes ir apsaugoti prekės ženklo vientisumą.

Toliau tobulindami ir plėsdami šią sistemą tikimės, kad pamatysime jos poveikį gėrimų pramonei ir vartotojų saugumui. Kelionė nuo koncepcijos iki įgyvendinimo rodo, kad naudodami tinkamus įrankius ir metodą galime padaryti didelę pažangą spręsdami net sudėtingiausias produktų autentifikavimo ir vartotojų apsaugos problemas.

Ištekliai

Source link

Draugai: - Marketingo agentūra - Teisinės konsultacijos - Skaidrių skenavimas - Fotofilmų kūrimas - Miesto naujienos - Šeimos gydytojai - Saulius Narbutas - Įvaizdžio kūrimas - Veidoskaita - Nuotekų valymo įrenginiai - Teniso treniruotės - Pranešimai spaudai -