FreeGo 髿§èœæ¡æ¶ïŒæéåæ»å»ïŒ

è¯èš / Languages: ç®äœäžæ · English · ç¹é«äžæ
ð äžæ³šäºæèŽæ§èœäŒåãæéåæ»å»äžåŒºå®å
šååç Go è¯èšäŒäžçº§æ¡æ¶ïŒå®å
šæ¶æäžå®ç°æµçšè§ README_SECURITY.mdïŒ
FreeGo é¢åé«å¹¶åäžåŒºå®å
šåºæ¯ïŒPlan2 ç»åœ/å¯é¥äº€æ¢éçš NIST æéåæ åç®æ³ïŒML-KEM-1024 / ML-DSA-87ïŒïŒç»åœæ JWT çŸå䞺 HMAC-SHA256ïŒå
žå HS256ïŒïŒäžå¡æ¥æå段 s 䞺 HMAC-SHA256 宿޿§æ ¡éªïŒèœœè·å¯é AES-256-GCMãæ žå¿èœåèçŠåšæå¡æ¥å
¥å±ãæ°æ®è®¿é®å±åäžæå·¥çšåé
å¥ç»ä»¶ïŒ
- API æ¡æ¶ïŒæäŸ HTTP / WebSocket / RPCX æ¥å
¥äžè¿æ»€åšéŸèœåïŒå¹¶æäŸè®€è¯ãææã宿޿§æ ¡éªåé²éæŸèœåïŒå®å
šæµçšäžåšèæš¡åè§
README_SECURITY.mdã
- ORM æ¡æ¶ïŒé¢å MySQL / Mongo çæäœåå°çç¹è·¯åŸäžé¢åé
åå¥œæ°æ®è®¿é®èœåïŒå
Œé¡Ÿååäžå
åæçïŒä»¥
ormx 䞺åïŒã
åæ¶æäŸçŒåïŒå«æ¬å°äž RedisïŒãååžåŒéäžéæµãAMQP æ¶æ¯ãç»æåæ¥å¿ãYAML é
眮è£
蜜çå·¥çšåé
å¥èœåïŒäŸ¿äºåšç产ç¯å¢æŒè£
æå¡ãå¯¹å€ HTTPS/TLS äžè¬ç±åå代çæçœå
³ç»æ¢ïŒæ¡æ¶äŸ§éåºçšå±è·¯ç±ãè¿æ»€åšäžå¯ç åŠèœåïŒç»åè§å®å
šææ¡£ïŒã
ð ç®åœ
ð æ¡æ¶ç¹æ§
ð Server & API æ¡æ¶
| ç¹æ§ |
æè¿° |
äŒå¿ |
| ð 髿§èœ HTTP |
髿§èœ HTTP åŒæïŒå
žååºæ¯ååæŸèé«äº net/httpïŒååºæ¯åæµïŒ |
åæº QPS 50,000+ïŒè§ç¡¬ä»¶äžåæµïŒ |
| ð¡ïž æéåæ»å» |
Plan2ïŒML-KEM-1024 åå + ML-DSA-87 ååå€å±çŸ |
NIST æç PQC æ¹æ¡ïŒç»åœ/å¯é¥äº€æ¢äžäŸèµ ECC/RSA |
| ð é«åŒºåºŠå¯¹ç§°æ |
JWTïŒHMAC-SHA256ïŒHS256ïŒïŒæ¥æ sïŒHMAC-SHA256 +ïŒå¯éïŒAES-256-GCM |
äžåžžè§ JWT/æ¥æ MAC æ äžèŽïŒæå¯¹æ¥äžå®¡è®¡ |
| ð é²éæŸæ»å» |
åè®® nïŒ32B éæºïŒ+ æ¶éŽæ³ + sïŒHMAC-SHA256ïŒ |
äžå¡/æšéç»äž MACïŒè§å®å
šææ¡£ïŒ |
| ð¥ RBAC æéæ§å¶ |
è§è²æé管çç³»ç» |
äŒäžçº§è®¿é®æ§å¶ |
| â¡ äžçº§éæµ |
çœå
³/æ¹æ³/çšæ·éæµ |
鲿¢ç³»ç»è¿èœœ |
| ð§ è¿æ»€åšéŸ |
宿ŽçäžéŽä»¶ç³»ç» |
æ¯æèªå®ä¹æ©å± |
ðïž ORM æ°æ®åºæ¡æ¶
| ç¹æ§ |
æè¿° |
æ§èœæå |
| ðŸ é¶å
åæµªè޹ |
粟确容éé¢åé
|
åå° 90%+ GC ååïŒå
žåæ¹éåºæ¯ïŒä»¥å®æµäžºåïŒ |
| â¡ æäœåå°åŒé |
çžå¯¹å
žååå°å ORMïŒçç¹è·¯åŸæŽå°äŸèµåå°ïŒå
æ°æ®/æ å°çä»å¯èœäœ¿çšåå°ïŒä»¥ ormx 䞺åïŒ |
çŽæ¥è£
é
+ ç±»å纊æ |
| ð§ æºèœé¢äŒ° |
éåœ OR æ¡ä»¶ç²Ÿç¡®è®¡ç® |
倿æ¥è¯¢æ§èœäŒå |
| ð é«å¹¶åæ¯æ |
æºèœè¿æ¥æ± + ååæäœ |
æ¯æ 10,000+ å¹¶å |
æéåæ»å»äžé«åŒºåºŠå¯ç
FreeGo éçš NIST å·²æ ååãå·¥çšå¯éšçœ² çæéåå¯ç ç»åïŒ
| é¶æ®µ |
èœå |
ç®æ³ïŒå®ç°ïŒ |
æéåå«ä¹ |
| å¿åç»åœ / å¯é¥äº€æ¢ |
Plan2ïŒp=2ïŒ |
ML-KEM-1024 å°è£
+ ML-DSA-87 å€å±çŸ |
NIST PQC æ åæïŒæçææïŒïŒ1024 级 KEM æ¿ä»£ X25519/ECDH |
| Token çŸåäžæ ¡éª |
JWT ç¬¬äžæ®µ |
HMAC-SHA256ïŒHS256ïŒ |
æ å JWT çŸåéªè¯ç¬¬äžæ®µïŒé
åç expãå¯é¥èœ®æ¢ |
| äŒè¯ Secret |
GetTokenSecret |
äžçŸåå¯é¥ç»å®çæŽŸçææïŒå®ç°è§æºç ïŒ |
äŸæ¥æ MAC /ïŒå¯éïŒAES-GCMïŒäžèœåºãæé掟ç |
| äžå¡å®æŽæ§ |
åæ®µ s |
HMAC-SHA256 |
ç»äžäžå¡äžæšéæ¥æå®æŽæ§ïŒäž SignBodyMessage çè·¯åŸäžèŽïŒè§å®å
šææ¡£ïŒ |
| èœœè·æºå¯æ§ |
Plan1/2 å å¯ |
AES-256-GCM |
256 äœå¯¹ç§°å¯é¥ïŒéåäž Grover 纊çä»· 128 äœå®å
šåŒºåºŠïŒä»é«äº 128 äœçº¯ AES é»è®€è§æ |
åŠäœçè§£ãèœæéåç Žè§£ãïŒ
- é对称é¢ïŒæå€§çæ¿ïŒïŒPlan2 ç»åœäž
/key æ¡æå·²çš ML-KEM + ML-DSAïŒäžåäœ¿çš Ed25519/X25519/RSAïŒå¯åºå¯¹ãå€§è§æš¡éåè®¡ç®æºç Žè§£å
¬é¥ãç±»åšèæš¡åã
- 对称é¢ïŒToken ä¹åïŒïŒJWT äžæ¥æ MAC 䞺 HMAC-SHA256ïŒèœœè·å¯é AES-256-GCMãéé
åå¯é¥èœ®æ¢ãç
expãé²éæŸïŒn/t/sïŒäž TLSã
- 蟹ç诎æïŒPlan0/1 ç»åœæäžå¡åž§äžé倿ºåžŠ ML-DSA å€å±çŸïŒäŸèµ JWTïŒHMAC-SHA256ïŒ+ æ¥æ HMAC-SHA256 +ïŒå¯éïŒGCMïŒè¥èŠæ±æ¯äžåž§å垊æéåé对称å€å±çŸïŒåºäœ¿çš Plan2 æ RPCX ç ML-DSA è·¯åŸãäŒ èŸå± TLS 1.3 ä»å»ºè®®ç±çœå
³/åå代çç»æ¢ã
å®ç°æµçšäžåå±é²æ€è§ README_SECURITY.mdã
æ žå¿ç»ä»¶æ¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â FreeGo Framework â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â äžå€§æå¡ç«¯ïŒHTTP · WebSocket · RPCXïŒ â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â HTTP · WebSocket · RPCX â â
â â â¢ åæº QPS: 50,000+ïŒHTTP å
žååºæ¯ïŒè§ç¡¬ä»¶ïŒ â â
â â ⢠ååºå»¶è¿: äºæ¯«ç§çº§ïŒå
žå HTTP è·¯ç±ïŒ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Filter Chain (è¿æ»€åšéŸ) â
â ââââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââ â
â â éæµè¿æ»€åš â åæ°è¿æ»€åš â äŒè¯è¿æ»€åš â æéè¿æ»€åš â èªå®ä¹â â
â ââââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Security & CryptoïŒPlan2 æéå + JWT/æ¥æ HMAC-SHA256ïŒ â
â ââââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââ â
â â JWT/HS256 â ML-DSA-87 â ML-KEM-1024â AES-256-GCMâHMAC256â â
â ââââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Business Logic Layer (äžå¡å±) â
â ââââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââ â
â â 请æ±äžäžæ â è·¯ç±ç®¡ç â äžéŽä»¶ç®¡ç â é误å€ç â çæ§ â â
â ââââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ORM Layer (æ°æ®è®¿é®å±) â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â FreeGo ORM â â
â â ⢠é¶å
åæµªè޹ ⢠æäœåå°çç¹ â¢ ç²Ÿç¡®å®¹éé¢äŒ° â â
â â ⢠é«å¹¶åäŒåïŒæ§èœæŸèæå â â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â Database Layer (æ°æ®åºå±) â
â ââââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââââââââ¬âââââââ â
â â MySQL â MongoDB â Redis çŒå â é / éæµ â æ©å± â â
â ââââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââââââââŽâââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ãæ§èœææ æåœãïŒ2026-05-19ïŒ`http_test.go` æ¬æº 1m åæµïŒè¯Šè§ [`http_benchmark_report.md`](./http_benchmark_report.md)ïŒ
⢠`PostByPlan2`ïŒML-KEM+ML-DSA Plan2 ç»åœïŒ`/login`ïŒ: â3,393 TPS ⢠`PostByPlan01`ïŒJWT+HMAC-SHA256 ç»åœæïŒ`/getUser`ïŒ: â52,320 TPS
⢠PostByPlan2 ns/op: 358,253 ⢠PostByPlan01 ns/op: 22,932 ⢠倱莥ç: 0.00%
⢠MySQL FindOne: 11,169 ns/opïŒFreeGoïŒ vs 16,471 ns/opïŒGORMïŒ
⢠MySQL Update: 180,680 ns/opïŒFreeGoïŒ vs 358,455 ns/opïŒGORMïŒ
⢠并åè¿æ¥: 10,000+ ⢠倱莥ç: 0.00%ïŒæ¥åæ ·æ¬æ¹æ¬¡ïŒ
ð§ å¿«éåŒå§
ðŠ å®è£
go get github.com/godaddy-x/freego
ð åºç¡ç€ºäŸ
package main
import (
"github.com/godaddy-x/freego/node"
"github.com/godaddy-x/freego/utils/jwt"
)
func main() {
httpNode := &node.HttpNode{}
// é
眮 JWT 讀è¯
httpNode.AddJwtConfig(jwt.JwtConfig{
TokenKey: "your-256-bit-secret-key",
TokenExp: jwt.ONE_HOUR,
})
// æ·»å è·¯ç±
httpNode.GET("/health", func(ctx *node.Context) error {
return ctx.Json(map[string]interface{}{"status": "ok"})
})
// å¯åšæå¡
httpNode.StartServer(":8080")
}
ð å®å
šç¹æ§
æéåæ»å»äžè®€è¯äœç³»
- Plan2 ç»åœææïŒæéåæ»å»ïŒ: ML-KEM-1024 ååå°è£
ååäŒè¯å¯é¥ + ML-DSA-87 ååå€å±èº«ä»œçŸïŒ
eïŒïŒHTTP/WebSocket/RPCX äž»éŸè·¯å·²ç§»é€ Ed25519/X25519
- JWT Token: å
žå䞺 HMAC-SHA256ïŒHS256ïŒ çŸåç¬¬äžæ®µïŒæ¯æç
exp äž RBACïŒç»è以 utils/jwt äžè·¯ç±é
眮䞺åïŒ
- äŒè¯ Secret:
GetTokenSecret äžçŸåå¯é¥ååæŽŸçïŒäžèœåºãæé掟çïŒäŸæ¥æ MAC /ïŒå¯éïŒå å¯
- HMAC-SHA256: äžå¡
s äžæšéç»äžå®æŽæ§ MACïŒSignBodyMessageïŒ
- AES-256-GCM: 蜜è·è®€è¯å å¯ïŒæ Plan / è·¯ç±å¯çšïŒ
å€é讀è¯äœç³»ïŒç»åœåïŒ
- ç»åœæ Plan0/1ïŒJWTïŒHMAC-SHA256ïŒ+ æ¥æ
sïŒHMAC-SHA256ïŒ +ïŒå¯éïŒAES-GCM
- å¿å Plan2ïŒåšäžååºç¡äžå¢å ML-KEM/ML-DSA éå¯¹ç§°ä¿æ€ïŒè¯Šè§å®å
šææ¡£ïŒ
å®å
šæºå¶
åšå¯ç åŠèœåä¹äžïŒæ¡æ¶åšè¯·æ±è¿å
¥äžå¡ååŒºå¶æ§è¡äžåæºå¶ïŒHTTP / WebSocket / RPCX äž»éŸè·¯äžèŽïŒç»è以æºç 䞺åïŒïŒ
| æºå¶ |
äœçš |
å®ç°èŠç¹ |
| æ¶éŽçª |
éå¶è¿æè¯·æ± |
é»è®€ ±5 åéïŒjwt.FIVE_MINUTESïŒïŒæ ¡éª body.t |
| åè®® Nonce |
é²éæŸãå¯äžè¯·æ± |
n = Base64(32B CSPRNG)ïŒValidProtocolNonceïŒRedis å»éïŒå
žå TTL 10 åéïŒ |
| çŸåå»é |
é²åäž s éæŸ |
validReplayAttack 对 HMAC çŸåçŒåæç»éå€ |
| è§èäž²ç»å® |
é²è·šæ¥å£/é级 |
MAC/AAD ç»å® path + d + n + t + p (+ u)ïŒHTTP èŠæ± body.r 䞺空 |
| Plan åæµ |
ææš¡åŒæ ¡éª |
HTTP 以 p åºå Plan01 / Plan2ïŒWS åŠç»å UsePlan2 äž KeyRoute/LoginRoute |
| å屿 ¡éªïŒPlan2ïŒ |
身仜 + 宿޿§ |
å
éª ML-DSA å€å± eïŒåéª HMAC-SHA256ïŒsïŒäž GCM |
| æšééªçŸ |
é²äŒªé 广æ |
c=300ïŒs ç®æ³äžäžå¡çžåïŒå¯é¥äžº 广æå¯é¥ïŒPushKeyProvider / SetBroadcastKeyïŒ |
| è¿æ»€åšéŸ |
讀è¯äžæ»¥çšæ§å¶ |
çœå
³/æ¹æ³/çšæ· äžçº§éæµïŒSessionFilterïŒJWTïŒïŒRoleFilterïŒRBACïŒ |
| åžžéæ¶éŽæ¯èŸ |
éäœæ¶åºé£é© |
CompareBase64Sign / subtle.ConstantTimeCompare æ ¡éª s |
åæ®µéæ¥ïŒææ··é¡¹ïŒïŒ
nïŒåè®®éæºæ°ïŒ32 åèïŒïŒâ GCM 坿å
12 åè IVïŒâ 订é
ID çšç UUIDã
sïŒå¯¹ç§° MACïŒHMAC-SHA256ïŒïŒPlan2 åŠæé对称 eïŒML-DSAïŒã
- Token / SecretïŒJWT 䞺 HMAC-SHA256 å
žåæ ïŒäŒè¯ Secret ç±
GetTokenSecret çäžçŸåå¯é¥ååæŽŸçïŒå®ç°è§æºç ïŒã
å®å
šæ¶æäž Plan æµçšè§ README_SECURITY.mdã
ð æ§èœå¯¹æ¯
HTTP API æ§èœ
| æµè¯åºæ¯ |
SDK æ¹æ³ |
Benchmark |
åæµå£åŸ |
æ¯ç§æ§è¡æ° |
ns/op |
B/op |
倱莥ç |
| Plan2 å¿åç»åœïŒML-DSA + ML-KEMïŒ |
PostByPlan2 |
BenchmarkHttpSDK_PostByPlan2 |
1m à 1 run |
â 3,393/s |
358,253 |
175,721 |
0.00% |
| Plan0/1 ç»åœæè¯·æ± |
PostByPlan01 |
BenchmarkHttpSDK_PostByPlan01 |
1m à 1 run |
â 52,320/s |
22,932 |
4,996 |
0.00% |
宿޿¹æ³ãåå§èŸåºäžå€±èŽ¥ç»è®¡å£åŸè§ http_benchmark_report.mdã
ORM æ§èœå¯¹æ¯ïŒMySQLïŒç¬ç«è¿çš 60sïŒ
| åºæ¯ |
FreeGoïŒsqldïŒ |
GORM |
GORM / FreeGo |
FindOne ns/op |
11,169 |
16,471 |
â 1.47Ã |
FindList 100 ns/op |
165,937 |
253,354 |
â 1.53Ã |
FindList 500 ns/op |
596,669 |
825,536 |
â 1.38Ã |
FindList 1000 ns/op |
422,738 |
1,472,001 |
â 3.48Ã |
FindList 2000 ns/op |
751,271 |
3,189,665 |
â 4.25Ã |
Save ns/op |
301,592 |
368,179 |
â 1.22Ã |
Update ns/op |
180,680 |
358,455 |
â 1.98Ã |
äžè¡šæ¥èª orm_performance_report.md çç¬ç«è¿çš 60s æ¹æ¬¡ïŒåå项倱莥çå䞺 0.00%ãMongo è§ mongodb_performance_report.mdã
ðïž ORM ç¹æ§
æ žå¿äŒåææ¯
- é¶å
åæµªè޹: 粟确容éé¢åé
ïŒé¿å
æ©å®¹
- æäœåå°åŒé: çç¹è·¯åŸäŸ§éçŽæ¥è£
é
äžé¢åé
ïŒåå°åå°äŸèµïŒå
æ°æ®è§£æïŒä»¥
ormx 䞺åïŒ
- æºèœé¢äŒ°: éåœ OR æ¡ä»¶ç²Ÿç¡®å®¹é计ç®
- é«å¹¶åæ¯æ: ååæäœåæºèœè¿æ¥æ±
éçšåºæ¯
- é«é¢æ°æ®åºæäœ
- å€§æ°æ®éå€ç
- å
åææåºçš
- 区äžèŽã髿§èœææ°æ®å¯éåäžå¡ç³»ç»
ð¯ éæ©æå
éæ© FreeGo ççç±
| éæ±åºæ¯ |
FreeGo äŒå¿ |
éçšé¡¹ç® |
| ð 髿§èœ |
MySQL å€åºæ¯ ns/op äœäº GORMïŒçºŠ 1.22Ã~4.25ÃïŒ |
é«å¹¶å Web æå¡ |
| ð 区å®å
š / æ¯ä»åºæ¯ |
Plan2 æéåç»åœ + JWT/æ¥æ HMAC-SHA256ïŒè§å®å
šææ¡£ïŒ |
éèãæ¯ä»ç³»ç» |
| ðŸ å
åäŒå |
åš Save / Update çåè·¯åŸ B/opãallocs/op æŽäœ |
å
åææåºçš |
| ðïž æ°æ®åºå¯é |
æäœåå°çç¹ ORMïŒæºèœå®¹éé¢äŒ° |
æ°æ®å¯éåç³»ç» |
å¿«ééšçœ²
# 瀺äŸïŒGo çæ¬äž go.mod äžèŽïŒéçšäºäœ çåºçšä»åºïŒæ¬ä»åºäžºåºæ¶éèªåžŠ main å
åæå»ºïŒ
FROM golang:1.26-alpine
WORKDIR /app
COPY . .
RUN go build -o main .
CMD ["./main"]
ð èç³»äžæ¯æ
欢è¿éè¿ Issues åéŠé®é¢äžå»ºè®®ã