Cache api device keys
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
04028b41e7
commit
26017568f0
|
@ -3,6 +3,7 @@ module 51m0n.com/EnvironmentManagerAPI/v2
|
|||
go 1.15
|
||||
|
||||
require (
|
||||
github.com/coocood/freecache v1.1.1
|
||||
github.com/gin-gonic/gin v1.7.4
|
||||
go.mongodb.org/mongo-driver v1.7.2
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
|
||||
|
|
14
Api/go.sum
14
Api/go.sum
|
@ -1,4 +1,9 @@
|
|||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc=
|
||||
github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
|
@ -80,6 +85,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
|
|||
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
|
@ -109,8 +115,11 @@ golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaE
|
|||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -125,8 +134,13 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
|
|
@ -17,8 +17,8 @@ func main() {
|
|||
}
|
||||
|
||||
func initializeRoutes(r *gin.Engine) {
|
||||
//r.POST("/data", src.CreateData)
|
||||
//r.PUT("/data/:id", src.CreateEnvironmentData)
|
||||
r.POST("/data", src.CreateData)
|
||||
r.PUT("/data/:id", src.CreateEnvironmentData)
|
||||
r.Use(src.AEADHandler)
|
||||
{
|
||||
r.PUT("/data/authed/:id", src.CreateEnvironmentData)
|
||||
|
|
|
@ -6,7 +6,9 @@ import (
|
|||
"os"
|
||||
|
||||
"encoding/base64"
|
||||
"encoding/binary"
|
||||
|
||||
"github.com/coocood/freecache"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
|
@ -16,9 +18,16 @@ import (
|
|||
|
||||
const salt = "ENVIRONMENT"
|
||||
|
||||
// 30m
|
||||
const timeout = 1800
|
||||
|
||||
// 10m
|
||||
const cacheSize = 10 * 1024 * 1024
|
||||
|
||||
var dbCollection *mongo.Collection
|
||||
var dbDevices *mongo.Collection
|
||||
var mongoClient *mongo.Client
|
||||
var cache *freecache.Cache
|
||||
|
||||
func DbConnect() {
|
||||
mongoClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(getMongoURI()))
|
||||
|
@ -33,21 +42,36 @@ func DbConnect() {
|
|||
db := mongoClient.Database("Environment")
|
||||
dbCollection = db.Collection("Main")
|
||||
dbDevices = db.Collection("Devices")
|
||||
cache = freecache.NewCache(cacheSize)
|
||||
}
|
||||
|
||||
func GetDeviceKey(api uint64) ([]byte, error) {
|
||||
apiSigned := int64(api)
|
||||
filter := bson.D{{"ApiID", apiSigned}}
|
||||
var result bson.M
|
||||
err := dbDevices.FindOne(context.TODO(), filter).Decode(&result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cacheKey := Uint64ToBytes(api)
|
||||
// Check the cache for the user
|
||||
val, err := cache.Get(cacheKey)
|
||||
if err == nil {
|
||||
return val, err
|
||||
} else {
|
||||
apiSigned := int64(api)
|
||||
filter := bson.D{{"ApiID", apiSigned}}
|
||||
var result bson.M
|
||||
err := dbDevices.FindOne(context.TODO(), filter).Decode(&result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
key, err := DeriveKey(result["Passcode"].(string))
|
||||
fmt.Printf(base64.StdEncoding.EncodeToString(key))
|
||||
// We should cache this!
|
||||
return key, err
|
||||
key, err := DeriveKey(result["Passcode"].(string))
|
||||
fmt.Printf(base64.StdEncoding.EncodeToString(key))
|
||||
// We should cache this!
|
||||
_ = cache.Set(cacheKey, key, timeout)
|
||||
return key, err
|
||||
}
|
||||
}
|
||||
|
||||
func Uint64ToBytes(num uint64) []byte {
|
||||
buf := make([]byte, 8)
|
||||
binary.BigEndian.PutUint64(buf, num)
|
||||
return buf
|
||||
}
|
||||
|
||||
func DeriveKey(passcode string) ([]byte, error) {
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
module 51m0n.com/EnvironmentManagerTest/v2
|
||||
|
||||
go 1.15
|
||||
|
||||
require golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
|
|
@ -0,0 +1,9 @@
|
|||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
@ -0,0 +1,73 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"golang.org/x/crypto/blake2s"
|
||||
"golang.org/x/crypto/chacha20poly1305"
|
||||
)
|
||||
|
||||
type EnvironmentData struct {
|
||||
Temp float64 `json:"t" binding:"required"`
|
||||
Humidity float64 `json:"h" binding:"required"`
|
||||
}
|
||||
|
||||
const passcode = "pass2"
|
||||
const salt = "ENVIRONMENT"
|
||||
|
||||
func main() {
|
||||
data := EnvironmentData{Temp: 25, Humidity: 40}
|
||||
b, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
pass, err := DeriveKey(passcode)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
aead, err := chacha20poly1305.New([]byte(pass))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
iv := make([]byte, chacha20poly1305.NonceSize)
|
||||
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
cypher := aead.Seal(nil, iv, b, nil)
|
||||
cypher = append(iv, cypher...)
|
||||
request, err := http.NewRequest(http.MethodPut, "http://localhost:8080/data/authed/7701238505945920037", bytes.NewReader(cypher))
|
||||
|
||||
if err == nil {
|
||||
resp, err := http.DefaultClient.Do(request)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
fmt.Printf("Sent, code: %s", resp.Status)
|
||||
} else {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func DeriveKey(passcode string) ([]byte, error) {
|
||||
|
||||
hash, err := blake2s.New256(nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
hash.Write([]byte(salt))
|
||||
hash.Write([]byte(passcode))
|
||||
|
||||
fmt.Printf("SALT %s PASS %s\n", salt, passcode)
|
||||
|
||||
return hash.Sum(nil), nil
|
||||
}
|
|
@ -8,10 +8,10 @@
|
|||
<h2>@Model.device.Name</h2>
|
||||
<h4>Current Conditions</h4>
|
||||
<div>
|
||||
Temp: @Model.data.LastOrDefault()?.Temperature.ToString("N1")°C
|
||||
Temp: @Model.data.FirstOrDefault()?.Temperature.ToString("N1")°C
|
||||
</div>
|
||||
<div>
|
||||
Humidity: @Model.data.LastOrDefault()?.Humidity.ToString("N1")%
|
||||
Humidity: @Model.data.FirstOrDefault()?.Humidity.ToString("N1")%
|
||||
</div>
|
||||
</div>
|
||||
<div >
|
||||
|
@ -19,8 +19,8 @@
|
|||
</div>
|
||||
|
||||
<script src="~/lib/chart.js/dist/chart.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/moment"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/moment.js" integrity="sha256-8AdWdyRXkrETyAGla9NmgkYVlqw4MOHR6sJJmtFGAYQ=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment@1.0.0/dist/chartjs-adapter-moment.min.js" integrity="sha256-sFB24K2xU2EOgWAtb3ySAGjhMqcUvUJGmwjDcTQa04k=" crossorigin="anonymous"></script>
|
||||
<script src="~/js/temperature_chart.js" asp-append-version="true"></script>
|
||||
<script>
|
||||
var ctx = document.getElementById('tempChart');
|
||||
|
|
Loading…
Reference in New Issue