yepasswd で パスワードを生成

Debian 11 から、/etc/shadow の暗号化手法が新しくなったらしい。

# 環境

- Debian Testing (2024/7/6時点のDebian 13)

# /etc/shadow

```
$ sudo grep nanbuwks /etc/shadow
nanbuwks:$y$abc$abcdefgh...$abcdefg.....:19910:0:99999:7:::
```

ここのフォーマットは、
「Understanding /etc/shadow file format on Linux - nixCraft」
https://www.cyberciti.biz/faq/understanding-etcshadow-file/
によると、

`<ユーザ名>:$<謎1>$<謎2>$<謎3>$<謎4>:<最終パスワード変更日>:<パスワード変更最小期間>:<パスワード期限>:<パスワード変更警告期間>:<アカウント失効猶予期間>:<有効期限>:`

らしい。

$で囲まれた謎1〜謎4は何かな?

`$y$` は yescrypt という形式らしい。

ここの 謎部分を生成するためには昔は openssl passwd コマンドを使っていたらしいが、yescrypt は対応してないらしい。



# 資料

これは InterNetNews 用のツールであるが
「ckpasswd」
https://www.eyrie.org/~eagle/software/inn/docs/ckpasswd.html

ここに書いてあるスクリプトでチェック
```
perl -le 'print crypt("<パスワード>", q{$<謎1>$<謎2>$<謎3>$})'
```
を実行すると、

`$<謎1>$<謎2>$<謎3>$<謎4>`
が出力され、 /etc/shadow の値と一致した。

以下のようになっているらしい

|||
|:---:|:---:|
|謎1|暗号化形式|
|謎2|??|
|謎3|SALT|
|謎4|暗号化パスワード|


# python で試してみたいけどダメだった。

python で、SALT を生成して yescrypt 処理ができないかな?

SALT を作る
```
import random
BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
chars=[]
for i in range(16):
  chars.append(random.choice(BASE62))
print(  "".join(chars))

```

ここまではOK.

yecrypt については、以下があった。

https://github.com/0xcb/pyescrypt

debian パッケージには無かったので pip でインストールしようとしたが
```
# pip install pyescrypt
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
root@debian12Testing:~# pip install apyescrypt
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

```

wheel の依存関係が解消できないのであきらめました。

```
# apt list --installed  | grep wheel

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

python3-wheel/testing,now 0.43.0-1 all [installed]
```

# mkpasswd コマンドを使う

以下でインストール

```
# apt install whois
```

```
$ echo hogehoge3 | mkpasswd --stdin 

```
とすると、 SALT 付で hogehoge を暗号化します。

```
$ echo hogehoge | mkpasswd --stdin
$y$j9T$K1qIOyzqHzYPSmBplHpjC0$uBkDA/frN6YLKZE21XcfIimUWgLcov1Q.kMAIp7hXE0
$ echo hogehoge | mkpasswd --stdin
$y$j9T$tgJa7AWYlScZ9wl0HCSYJ0$n6j9IzHT4oApco5mBKhwsqoXQUUAtxOF0oML4m2vCcD
```
SALT を指定する方法は以下のようにエラーが出てうまくいきませんでしたが、

```
$ mkpasswd --salt=abc
Wrong salt length: 3 bytes when 0 expected.
```
毎回実行ごとにSALT使っては新たに生成されるみたいなのでこれを使っても良さそうです。