diff --git a/README.md b/README.md index 1503f45..06cd32a 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,51 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/tlinden/gowipe)](https://goreportcard.com/report/github.com/tlinden/gowipe) [![GitHub release](https://img.shields.io/github/v/release/tlinden/gowipe?color=%2300a719)](https://github.com/TLINDEN/gowipe/releases/latest) +## Description + +`gowipe` is a simple self contained tool to securely wipe files and +directories. By default it renames and overwrites files and +directories 30 times and uses the `secure` mode, which uses strong +random bytes for the overwriting process. Gowipe writes as much bytes +into a file as its original size. + +You can tweak mode and round numbers. Other modes are `zero`, which +uses zeroes for overwriting (not recommended) or `encrypt` which +encrypts the data using AES and a strong random key. This is the most +secure but also to slowest mode. + +Although you can use `gowipe` on SSD disks, it doesn't make much +sense. To wipe such a disk you have to resort to other means. But you +can savely use it on magnetic discs or usb drives. + +Of course there are many other such tools available, this one is +insofar special as you can download a pre-compiled binary without any +library dependencies. This allows you to wipe files on systems, where +you cannot install a wiper via some package management (such as +appliance systems or vm's). + +## Example + +Overwrite the directory `vhs` recursively 50 times using strong +encryption and verbose output: + +```shell +gowipe -c 50 -E -r -v vhs +Wiped vhs/help.png (355011 bytes) +Wiped vhs/rec.Dockerfile (348 bytes) +Wiped vhs/rec.gif (3533338 bytes) +Wiped vhs/rec.tape (852 bytes) +Wiped vhs (4096 bytes) + + Dirs wiped: 1 + Files wiped: 5 +Bytes deleted: 3889549 + Time elapsed: 426.286639ms + Overwritten: 50 times + Wipe mode: encrypt + Recurse dirs: true +``` + ``` Usage: gowipe [-rcvz] ... diff --git a/crypto.go b/crypto.go index 5385f9b..ea65d92 100644 --- a/crypto.go +++ b/crypto.go @@ -1,5 +1,5 @@ /* -Copyright © 2022 Thomas von Dein +Copyright © 2022-2025 Thomas von Dein This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/main.go b/main.go index d8605b7..54af476 100644 --- a/main.go +++ b/main.go @@ -1,5 +1,5 @@ /* -Copyright © 2022 Thomas von Dein +Copyright © 2022-2025 Thomas von Dein This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,12 +22,13 @@ import ( "os" "path/filepath" "strings" + "time" "github.com/JojiiOfficial/shred" flag "github.com/spf13/pflag" ) -const VERSION string = "0.0.3" +const VERSION string = "0.0.4" const Usage string = `This is gowipe - destruct files in a non-recoverable way. Usage: gowipe [-rcvz] ... @@ -55,6 +56,9 @@ type Conf struct { nodelete bool norename bool verbose bool + files int + dirs int + size int64 } func main() { @@ -138,14 +142,26 @@ func main() { shredder := shred.Shredder{} shredconf := shred.NewShredderConf(&shredder, option, c.count, !c.nodelete) + start := time.Now() + for _, file := range flag.Args() { Wipe(file, &c, shredconf) } + + if c.verbose { + fmt.Println() + fmt.Printf(" Dirs wiped: %d\n", c.dirs) + fmt.Printf(" Files wiped: %d\n", c.files) + fmt.Printf("Bytes deleted: %d\n", c.size) + fmt.Printf(" Time elapsed: %s\n", time.Since(start)) + fmt.Printf(" Overwritten: %d times\n", c.count) + fmt.Printf(" Wipe mode: %s\n", c.mode) + fmt.Printf(" Recurse dirs: %t\n", c.recurse) + } } func Wipe(file string, c *Conf, wiper *shred.ShredderConf) { if info, err := os.Stat(file); err == nil { - if info.IsDir() { if !c.recurse { fmt.Printf("-r not set, ignoring directory %s\n", file) @@ -167,6 +183,8 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) { if err != nil { log.Fatal(err) } + + c.dirs++ } } else { if c.mode == "encrypt" { @@ -186,11 +204,15 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) { log.Fatal(err) } } + + c.size += info.Size() } if c.verbose { - fmt.Printf("Wiped %d times: %s\n", c.count, file) + fmt.Printf("Wiped %s (%d bytes)\n", file, info.Size()) } + + c.files++ } else { if os.IsNotExist(err) { fmt.Printf("No such file or directory: %s\n", file) @@ -227,10 +249,6 @@ func Rename(file string, c *Conf) string { } } - if c.verbose { - fmt.Printf("renaming %s/%s => %s/%s\n", dir, base, dir, newname) - } - err := os.Rename(filepath.Join(dir, base), filepath.Join(dir, newname)) if err != nil { log.Fatal(err) diff --git a/mkrel.sh b/mkrel.sh index 3c77e53..f0f3d2c 100755 --- a/mkrel.sh +++ b/mkrel.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright © 2022 Thomas von Dein +# Copyright © 2022-2025 Thomas von Dein # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by