項目地址 這個項目是很久以前的,當時go能力有限,寫的不盡人意。剛好最近有加密文件的需求,所以就完善了相關邏輯。 之前的方案還依賴 Seek(offset int64, whence int) (int64, error) ,看了go很多源碼,都說Seek不可靠。所以目前改為純Reader和Writ ...
這個項目是很久以前的,當時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
}
作者:janbar
出處:https://www.cnblogs.com/janbar
本文版權歸作者和博客園所有,歡迎轉載,轉載請標明出處。喜歡我的文章請 [關註我] 吧。
如果您覺得本篇博文對您有所收穫,可點擊 [推薦] 並 [收藏] ,或到右側 [打賞] 里請我喝杯咖啡,非常感謝。