專案地址
這個專案是很久以前的,當時go能力有限,寫的不盡人意,剛好最近有加密檔案的需求,所以就完善了相關邏輯,
之前的方案還依賴 Seek(offset int64, whence int) (int64, error) ,看了go很多原始碼,都說Seek不可靠,所以目前改為純Reader和Writer這兩種介面,當然檔案的結構也必須改變,
因為自帶hash校驗,因此內容連一個位元組都不能被篡改,安全性很高,而且隨機的aes密碼也是通過rsa進行加密,因此只要妥善保管好rsa的私鑰就能保證萬無一失,
加密后內容結構如下所示:
| rsa密文長度 | rsa加密aes密碼后的密文 | aes加密內容 | 資料hash值 |
|---|---|---|---|
| len(rsa(password)) | rsa(password) | aesEnc(data) | hash(data) |
下面是示例代碼:
package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"flag"
"io"
"log"
"os"
"github.com/jan-bar/EncryptionFile"
)
func main() {
org := flag.String("f", "", "enc file path")
flag.Parse()
src := *org // dst為生成的加密檔案,cmp是通過解密dst生成的檔案
dst, cmp := src+".dst", src+".cmp"
var pri, pub bytes.Buffer // 生成一對公私鑰資料
err := EncryptionFile.GenRsaKey(2048, &pub, &pri)
if err != nil {
log.Fatal(err)
}
//goland:noinspection GoUnhandledErrorResult
enc := func() error {
fr, err := os.Open(src)
if err != nil {
return err
}
defer fr.Close()
fw, err := os.Create(dst)
if err != nil {
return err
}
defer fw.Close()
return EncryptionFile.EncData(fr, fw, pub.Bytes(), md5.New())
}
if err = enc(); err != nil {
log.Fatal(err)
}
//goland:noinspection GoUnhandledErrorResult
dec := func() error {
fr, err := os.Open(dst)
if err != nil {
return err
}
defer fr.Close()
fw, err := os.Create(cmp)
if err != nil {
return err
}
defer fw.Close()
return EncryptionFile.DecData(fr, fw, pri.Bytes(), md5.New())
}
if err = dec(); err != nil {
log.Fatal(err)
}
md5Src, err := md5file(src)
if err != nil {
log.Fatal(err)
}
md5Org, err := md5file(cmp)
if err != nil {
log.Fatal(err)
}
if md5Src != md5Org {
log.Fatalf("src(%s) != org(%s)", md5Src, md5Org)
}
}
func md5file(s string) (string, error) {
fr, err := os.Open(s)
if err != nil {
return "", err
}
//goland:noinspection GoUnhandledErrorResult
defer fr.Close()
h := md5.New()
_, err = io.Copy(h, fr)
if err != nil {
return "", err
}
return hex.EncodeToString(h.Sum(nil)), nil
}
<style>.qm_point{color:#6DA47D;font-size:18px}.qm_a{color:#0000FF}</style>
作者:janbar
出處:https://www.cnblogs.com/janbar
本文著作權歸作者和博客園所有,歡迎轉載,轉載請標明出處,喜歡我的文章請 [關注我] 吧,
如果您覺得本篇博文對您有所識訓,可點擊 [推薦] 并 [收藏] ,或到右側 [打賞] 里請我喝杯咖啡,非常感謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540356.html
標籤:其他
上一篇:彩虹女神躍長空,Go語言進階之Go語言高性能Web框架Iris專案實戰-登錄與圖形驗證碼(captcha)EP06
