Minisignでファイルに署名,検証

ファイルの署名や検証にはPGP署名がよく使われますがZigではMinisignが使われています.たまにしか使わないので少し調べてみました.

検証に使う

Zigのダウンロードページには以下のように公開鍵が用意されていて,ダンロードファイルにそれぞれ署名ファイルが用意されています.

Files are signed with minisign using this public key:

RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U

MinisignはDebianパッケージがあるのでこちらを導入して使いました.

$ sudo apt install minisign
$ apt show minisign
Package: minisign
Version: 0.11-1
Priority: optional
Section: misc
Maintainer: Josenilson Ferreira da Silva <nilsonfsilva@hotmail.com>
Installed-Size: 49.2 kB
Depends: libc6 (>= 2.34), libsodium23 (>= 0.7.0)
Homepage: https://jedisct1.github.io/minisign/
Download-Size: 16.7 kB
APT-Manual-Installed: yes
APT-Sources: http://ftp.jp.debian.org/debian sid/main amd64 Packages
Description: Dead simple tool to sign files and verify signatures
 Minisign is a dead simple tool to sign files and verify signatures.
 It is portable, lightweight, and uses the highly secure Ed25519
 public-key signature system. Signature files include an untrusted
 comment line that can be freely modified, even after signature
 creation. They also include a second comment line, that cannot be
 modified without the secret key. Trusted comments can be used to add
 instructions or application-specific metadata (intended file name,
 timestamps, resource identifiers, version numbers to prevent
 downgrade attacks).
usage
$ minisign
Usage:
minisign -G [-f] [-p pubkey_file] [-s seckey_file] [-W]
minisign -R [-s seckey_file] [-p pubkey_file]
minisign -C [-s seckey_file] [-W]
minisign -S [-l] [-x sig_file] [-s seckey_file] [-c untrusted_comment]
            [-t trusted_comment] -m file [file ...]
minisign -V [-H] [-x sig_file] [-p pubkey_file | -P pubkey] [-o] [-q] -m file

-G                generate a new key pair
-R                recreate a public key file from a secret key file
-C                change/remove the password of the secret key
-S                sign files
-V                verify that a signature is valid for a given file
-H                require input to be prehashed
-l                sign using the legacy format
-m <file>         file to sign/verify
-o                combined with -V, output the file content after verification
-p <pubkey_file>  public key file (default: ./minisign.pub)
-P <pubkey>       public key, as a base64 string
-s <seckey_file>  secret key file (default: ~/.minisign/minisign.key)
-W                do not encrypt/decrypt the secret key with a password
-x <sigfile>      signature file (default: <file>.minisig)
-c <comment>      add a one-line untrusted comment
-t <comment>      add a one-line trusted comment
-q                quiet mode, suppress output
-Q                pretty quiet mode, only print the trusted comment
-f                force. Combined with -G, overwrite a previous key pair
-v                display version number
対象ファイルと,ペアの署名ファイルを入手
$ ls zig-linux-x86_64-0.1* -1
zig-linux-x86_64-0.13.0.tar.xz (1)
zig-linux-x86_64-0.13.0.tar.xz.minisig (2)
  1. 検証対象ファイル

  2. 署名ファイル

検証
$ minisign -V -P 'RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U' -m zig-linux-x86_64-0.13.0.tar.xz
Signature and comment signature verified
Trusted comment: timestamp:1717729444   file:zig-linux-x86_64-0.13.0.tar.xz     hashed
-V

検証

-P

公開鍵を文字列として指定

-m

検証対象ファイル(対象ファイル名.minisigという署名ファイルも必要)

自分用の鍵ペアを作る

-G オプションで鍵ペアを作ってみます.

鍵ペアの作成
$ minisign -G
Please enter a password to protect the secret key.

Password:
Password (one more time):
Deriving a key from the password in order to encrypt the secret key... done

The secret key was saved as /home/matoken/.minisign/minisign.key - Keep it secret!
The public key was saved as minisign.pub - That one can be public.

Files signed using this key pair can be verified with the following command:

minisign -Vm <file> -P RWThG1FeVewlpdqVHzH7T3qK6edFtP+lhSNQeXYat3+3wTdrZViImFnY

秘密鍵は ~/.minisign/minisign.key として,公開鍵は ./minisign.pub として保存されます.

鍵ペアファイル
$ ls ~/.minisign/ (1)
minisign.key
$ ls ./minisign.pub (2)
./minisign.pub
$ mv ./minisign.pub ~/.minisign/ (3)
$ cat ~/.minisign/minisign.key (4)
untrusted comment: minisign encrypted secret key
RWRTY0IyBLVcWBdD5v/ArFX7ojiwAJZD61u4Boh/zbWwDBNirL8AAAACAAAAAAAAAEAAAAAA2X06cJ9r2gcu90CflCMhe+uz2Qj2q4mdPpsAcTVkvl5OqUuHUG3vrKvlkRwT94SyOudc8GdiodD2JEFUVVawfZEWVovOSLmmnW2xvXXBdhLYHCcuz9CO9IxAGi7+o5vWy+cdFr8UNoA=
$ cat ~/.minisign/minisign.pub (5)
untrusted comment: minisign public key A525EC555E511BE1
RWThG1FeVewlpdqVHzH7T3qK6edFtP+lhSNQeXYat3+3wTdrZViImFnY
  1. 秘密鍵は ~/.minisign/minisign.key に保存される

  2. 公開鍵はminisignを実行したカレントディレクトリの minisign.pub に保存される

  3. 公開鍵も秘密鍵と同じ場所においておく

  4. 秘密鍵の内容※実際は公開してはいけない

  5. 公開鍵の中身

自分の鍵で署名してみる

$ minisign -S -s ~/.minisign/minisign.key -c 'elephant-in-snake cow(untrasted comment)' -t 'trasted comment' -m ./testfile
Password:
Deriving a key from the password and decrypting the secret key... done
-S

署名

-s

秘密鍵ファイルの指定

-c

信頼されないコメント(オプション)

-m

対象ファイル

Note

-c で指定する信頼されないコメントは書き換え可能,書き換えても検証に影響しない.

$ cat ./testfile.minisig (1)
untrusted comment: elephant-in-snake cow(untrasted comment)
RUThG1FeVewlpUvYukMYnjZAkVoSYf/e4FN3g9B7F7rDVeiQ1u47BuVoyGc7yQGvTOS8CegqC92yDPLFLI6Lxptha+hlurTexwE=
trusted comment: trasted comment
sdud1fIcQSEslt0Rndls7wOlzH4+mjKVQ8Smgh1790pwjsKdGOcBHWkxSa6VxlAqivKOkkAYf3qQPn4Deji+Bw==
$ minisign -V -p ~/.minisign/minisign.pub -m ./testfile (2)
Signature and comment signature verified
Trusted comment: trasted comment
$ minisign -V -P 'RWThG1FeVewlpdqVHzH7T3qK6edFtP+lhSNQeXYat3+3wTdrZViImFnY' -m ./testfile (3)
Signature and comment signature verified
Trusted comment: trasted comment
  1. 署名ファイルの中身

  2. 公開鍵で検証

  3. 公開鍵をコマンド指定して検証

パスワードの変更

$ minisign -C ~/.minisign/minisign.key (1)
Password: (2)
Deriving a key from the password and decrypting the secret key... done

Please enter a password to protect the secret key.

Password: (3)
Password (one more time): (4)
Deriving a key from the password in order to encrypt the secret key... done

Password updated.
  1. -C オプションで秘密鍵のパスワードを変更

  2. 変更前のパスワード

  3. 新パスワード

  4. 新パスワード

秘密鍵から公開鍵の作成

-R オプションで秘密鍵から公開鍵ファイルの再生成
$ minisign -R -s ~/.minisign/minisign.key -p ~/.minisign/minisign-new.pub
Password:
Deriving a key from the password and decrypting the secret key... done
$ diff ~/.minisign/minisign.pub ~/.minisign/minisign-new.pub

終わりに

PGPに比べると使い方は限定的だけど便利そうです.
Minisignは署名だけですが,暗号化についてはEncpipe 🏛️age 🏛️が紹介されています.ageはSSH鍵で暗号化復号化ができて便利です.Encpipeも試してみようと思います.

環境

$ dpkg-query -W minisign
minisign        0.11-1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64

One thought to “Minisignでファイルに署名,検証”

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)