GeneratePrivateKey.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package tool
  2. import (
  3. "crypto/ed25519"
  4. "crypto/rand"
  5. "fmt"
  6. )
  7. // GeneratePrivateKey 生成一个新的 Ed25519 私钥
  8. //
  9. // 返回值:
  10. // - privateKey: 生成的 Ed25519 私钥指针
  11. // - err: 错误信息,如果生成失败则返回错误
  12. //
  13. // 示例:
  14. //
  15. // privateKey, err := GeneratePrivateKey()
  16. // if err != nil {
  17. // // 处理错误
  18. // }
  19. // // 使用私钥生成 JWT token
  20. // token, err := GenerateToken(privateKey, claims)
  21. func GeneratePrivateKey() (privateKey *ed25519.PrivateKey, err error) {
  22. // 使用 crypto/rand 生成安全的随机数作为种子
  23. // Ed25519 私钥实际上是 32 字节的种子,公钥由种子推导而来
  24. var seed [32]byte
  25. // 从加密安全的随机数生成器读取种子
  26. _, err = rand.Read(seed[:])
  27. if err != nil {
  28. return nil, fmt.Errorf("生成随机种子失败: %w", err)
  29. }
  30. // 使用种子生成 Ed25519 密钥对
  31. // ed25519.NewKeyFromSeed 返回的是 ed25519.PrivateKey 类型(实际上是 []byte)
  32. privKey := ed25519.NewKeyFromSeed(seed[:])
  33. // 验证生成的私钥长度是否正确
  34. if len(privKey) != ed25519.PrivateKeySize {
  35. return nil, fmt.Errorf("生成的私钥长度无效: 期望 %d 字节,实际 %d 字节",
  36. ed25519.PrivateKeySize, len(privKey))
  37. }
  38. // 返回私钥的指针
  39. return &privKey, nil
  40. }