新密网站建设,我赢seo,网站改版的方式大致为,wordpress去除标志SHA(secure hashing algorithm)表示安全哈希算法.SHA是MD5的修正版本#xff0c;用于数据摘要和认证。哈希和加密类似#xff0c;唯一区别是哈希是单项的#xff0c;即哈希后的数据无法解密。SHA有不同的算法#xff0c;主要包括SHA-1, SHA-2, SHA-256, SHA-512, SHA-224, …SHA(secure hashing algorithm)表示安全哈希算法.SHA是MD5的修正版本用于数据摘要和认证。哈希和加密类似唯一区别是哈希是单项的即哈希后的数据无法解密。SHA有不同的算法主要包括SHA-1, SHA-2, SHA-256, SHA-512, SHA-224, and SHA-384等其中SHA-256是SHA-2家族的一个成员它把原数据转为256字节固定长度摘要信息SHA256的内部块大小为32位。本文介绍Golang如何使用sha256算法实现对配置文件的监控。
Golang hash256实现包
hash256包实现了FIPS 180-4规范中定义的SHA224、SHA256哈希算法。主要包括下面几个函数
func New() hash.Hash: 返回 hash.Hash用于计算SHA256哈希值。
func Sum256(data []byte) [Size]byte :返回计算SHA256的哈希值。
使用sha256.New()
下面示例使用New()函数返回Hash.hash:
package mainimport (crypto/sha256fmt
)func main() {h : sha256.New()h.Write([]byte(this is a password))// Calculate and print the hashfmt.Printf(%x, h.Sum(nil))
}过程很简单运行输出结果
289ca48885442b5480dd76df484e1f90867a2961493b7c60e542e84addce5d1e使用sha256.Sum256()函数
package mainimport (crypto/sha256fmt
)func main() {sum : sha256.Sum256([]byte(this is a password))fmt.Printf(%x, sum)
}更简洁输出结果一样。
下面示例展示两个字符串尽管只有一个字符微小差异但生成的hash却完全不同
package mainimport (crypto/sha256fmt
)func main() {sum : sha256.Sum256([]byte(this is a password))sumCap : sha256.Sum256([]byte(This is a password))fmt.Printf(lowercase hash: %x, sum)fmt.Println()fmt.Printf(Capital hash: %x, sumCap)
}运行输出结果
lowercase hash: 289ca48885442b5480dd76df484e1f90867a2961493b7c60e542e84addce5d1e
Capital hash: 9ae12b1403d242c53b0ea80137de34856b3495c3c49670aa77c7ec99eadbba6e监控配置文件变化
我们需要观察文件是否变化标准实现使用time.Ticker每隔几秒重新计算配置文件的哈希值如果哈希值发生变化则重新加载。
获取配置hash值
func getCfgHash() string {file, err : os.Open(test.cfg)defer file.Close()if err ! nil {panic(err)}hash : sha256.New()if _, err : io.Copy(hash, file); err ! nil {panic(err)}sum : fmt.Sprintf(%x, hash.Sum(nil))return sum
}上面方法步骤
打开配置文件从crypto/sha256创建hash.Hash对象解析文件内容到hash对象调用Sum方法获得hash值 上面示例中test测试文件可以随便输入一些内容生成文件hash值。
下面实现比较hash值方法
func compare(new string) bool {var oldStr oldFile, _ : os.Open(tmp.hash)oldBytes, _ : io.ReadAll(oldFile)oldStr string(oldBytes)oldFile.Close()if oldStr ! new {newFile, _ : os.Create(tmp.hash)fmt.Println(new hash:, new)newFile.WriteString(new)RefreshCfg()return false}return true
}先加载上一次保存的配置文件hash值与本次传入最新hash值进行比较如不同则保存最新hash值用于下一次比较同时调用RefreshCfg()方法该方法是具体业务实现这里仅给出空实现
func RefreshCfg() {fmt.Println( refresh config information.)
}
最后是main函数部分
func main() {// 先记录配置文件hash值cfgHash : getCfgHash()fmt.Println(cfg hash:, cfgHash)file, _ : os.Create(tmp.hash)file.WriteString(cfgHash)file.Close()// define an interval and the ticker for this intervalinterval : time.Duration(2) * time.Second// create a new Tickertk : time.NewTicker(interval)// start the ticker by constructing a loopfor range tk.C {fmt.Println(time running...)loadStr : getCfgHash()if !compare(loadStr) {fmt.Println(config file has changed...)}}
}首先保存当前配置文件的Hash值。然后利用Ticker每2秒比较一次比较。运行程序修改配置文件可以立刻看到程序监控到变化并调用RefreshCfg方法。
下面给出完整代码实现
package mainimport (crypto/sha256timefmtioos
)func main() {// 先记录配置文件hash值cfgHash : getCfgHash()fmt.Println(cfg hash:, cfgHash)file, _ : os.Create(tmp.hash)file.WriteString(cfgHash)file.Close()// define an interval and the ticker for this intervalinterval : time.Duration(2) * time.Second// create a new Tickertk : time.NewTicker(interval)// start the ticker by constructing a loopfor range tk.C {fmt.Println(time running...)loadStr : getCfgHash()if !compare(loadStr) {fmt.Println(config file has changed...)}}
}func RefreshCfg() {fmt.Println( refresh config information.)
}func getCfgHash() string {file, err : os.Open(test.cfg)defer file.Close()if err ! nil {panic(err)}hash : sha256.New()if _, err : io.Copy(hash, file); err ! nil {panic(err)}sum : fmt.Sprintf(%x, hash.Sum(nil))return sum
}func compare(new string) bool {var oldStr oldFile, _ : os.Open(tmp.hash)oldBytes, _ : io.ReadAll(oldFile)oldStr string(oldBytes)oldFile.Close()if oldStr ! new {newFile, _ : os.Create(tmp.hash)fmt.Println(new hash:, new)newFile.WriteString(new)RefreshCfg()return false}return true
}总结
数据加密算法规范非常复杂在大多数应用场景中需要广泛研究。但Golang提供了专门的库实现了许多流行的加密算法。本文演示了如何使用crypto/sha256对配置文件进行监控变化则重新加载配置文件。