如何使用哈希值来保护数据?
哈希值大大提高了数据的安全性。正如我已经提到的,它是一个单向的加密函数。一个加密哈希函数需要具备以下几个关键的特性才能被认为是有用的:
1.每个哈希值都是不同的。
2.对于相同的消息,总是生成相同的哈希值。
3.不可能根据哈希值来决定输入。
4.即使对输入的整个哈希值做一个小的更改也会被更改。
哈希值帮助我们查看数据是否被篡改。
例如,您下载了一段重要的信息,要查看数据是否改变,可以通过哈希值算法运行数据,比较数据的哈希值和接收数据的哈希值。
如果两个哈希值都是相同的,则不更改数据,如果哈希值不匹配,则在接收数据之前更改数据。
算法验证
启动代理服务器
启动代理服务器的代码如下:
package main
import (
"fmt"
"github.com/jasonkayzk/consistent-hashing-demo/core"
"github.com/jasonkayzk/consistent-hashing-demo/proxy"
"net/http"
)
var (
port = "18888"
p = proxy.NewProxy(core.NewConsistent(10, nil))
)
func main() {
stopChan := make(chan interface{})
startServer(port)
<-stopChan
}
func startServer(port string) {
http.HandleFunc("/register", registerHost)
http.HandleFunc("/unregister", unregisterHost)
http.HandleFunc("/key", getKey)
fmt.Printf("start proxy server: %s\n", port)
err := http.ListenAndServe(":"+port, nil)
if err != nil {
panic(err)
}
}
func registerHost(w http.ResponseWriter, r *http.Request) {
_ = r.ParseForm()
err := p.RegisterHost(r.Form["host"][0])
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
_, _ = fmt.Fprintf(w, err.Error())
return
}
_, _ = fmt.Fprintf(w, fmt.Sprintf("register host: %s success", r.Form["host"][0]))
}
func unregisterHost(w http.ResponseWriter, r *http.Request) {
_ = r.ParseForm()
err := p.UnregisterHost(r.Form["host"][0])
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
_, _ = fmt.Fprintf(w, err.Error())
return
}
_, _ = fmt.Fprintf(w, fmt.Sprintf("unregister host: %s success", r.Form["host"][0]))
}
func getKey(w http.ResponseWriter, r *http.Request) {
_ = r.ParseForm()
val, err := p.GetKey(r.Form["key"][0])
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
_, _ = fmt.Fprintf(w, err.Error())
return
}
_, _ = fmt.Fprintf(w, fmt.Sprintf("key: %s, val: %s", r.Form["key"][0], val))
}
和缓存服务器类似,这里采用 HTTP 服务器来模拟;
代理服务器监听 18888 端口的几个路由:
/register:注册缓存服务器;
/unregister:注销缓存服务器;
/key:查询缓存 Key;
这里为了简单起见,使用了这种方式进行服务注册,实际使用时请使用其他组件进行实现!
接下来启动缓存服务器:
start proxy server: 18888
启动缓存服务器
分别启动三个缓存服务器:
$ go run server/main.go -p 8080
start server: 8080
$ go run server/main.go -p 8081
start server: 8081
$ go run server/main.go -p 8082
start server: 8082
同时,代理服务器输出:
register host: localhost:8080 success
register host: localhost:8081 success
register host: localhost:8082 success
可以看到缓存服务器已经成功注册;
请求代理服务器获取 Key
可以使用 curl 命令请求代理服务器获取缓存 key:
$ curl localhost:18888/key?key=123
key: 123, val: hello: 123
此时,代理服务器输出:
Response from host localhost:8080: hello: 123
同时,8000 端口的缓存服务器输出:
cached key: {123: hello: 123}
removed cached key after 10s: {123: hello: 123}
可以看到,8000 端口的服务器对 key 值进行了缓存,并在 10 秒后清除了缓存;
尝试多次获取 Key
尝试获取多个 Key:
Response from host localhost:8082: hello: 45363456
Response from host localhost:8080: hello: 4
Response from host localhost:8082: hello: 1
Response from host localhost:8080: hello: 2
Response from host localhost:8082: hello: 3
Response from host localhost:8080: hello: 4
Response from host localhost:8082: hello: 5
Response from host localhost:8080: hello: 6
Response from host localhost:8082: hello: sdkbnfoerwtnbre
Response from host localhost:8082: hello: sd45555254tg423i5gvj4v5
Response from host localhost:8081: hello: 0
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。