ValueError: unsupported hash type md4を出さなくする方法

## ValueError: unsupported hash type md4がでて困った

あるスクリプトを実行するとエラーがでてしまった。
```python
...
File "/usr/lib/python3/dist-packages/ntlm_auth/compute_hash.py", line 66, in _ntowfv1
    digest = hashlib.new('md4', password.encode('utf-16-le')).digest()
  File "/usr/lib/python3.10/hashlib.py", line 166, in __hash_new
    return __get_builtin_constructor(name)(data)
  File "/usr/lib/python3.10/hashlib.py", line 123, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type md4
```

md4が使用できないようだった。
hashlibを確認するとmd4がavailableでなかった。

```python
└─$ python3
>>> import hashlib
>>> print(sorted(hashlib.algorithms_guaranteed))
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256']
>>> print(sorted(hashlib.algorithms_available))
['blake2b', 'blake2s', 'md5', 'md5-sha1', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'sha512_224', 'sha512_256', 'shake_128', 'shake_256', 'sm3']
```

これが原因らしい。
[Note: MD4 hash function availability in hashlib library depends on OpenSSL library that Python uses on specific platform. In OpenSSL 3, MD4 is marked as legacy and not available by default.](https://lindevs.com/code-snippets/generate-md4-hash-using-python)

デフォルトではmd4が使えないようなので使えるように設定を変更する。
[こちら(Additions to openssl.conf (settings/openssl.py) are required to work with legacy providers due to openssl upgrade to 3.0.3)](https://gitlab.com/kalilinux/packages/kali-tweaks/-/issues/27)を参考に設定を変更する。

opensslの設定ファイルを調べて、上の記述に従って変更する。
```
└─$ sudo find / -name openssl.cnf 2>/dev/null
└─$ vi /usr/lib/ssl/openssl.cnf
...
#
# OpenSSL configuration file. Forked by Kali.
# This is mostly being used for generation of certificate requests.
#

# Note that you can include other files from the main configuration
# file using the .include directive.
#.include /etc/ssl/kali.cnf #<---ここをコメントアウト

# This definition stops the following lines choking if HOME isn't
# defined.
HOME                    = .

# Extra OBJECT IDENTIFIER info:
#oid_file               = $ENV::HOME/.oid
oid_section             = new_oids

# System default
openssl_conf = default_conf

#move this from top to here
.include /etc/ssl/kali.cnf #<---上の記述をここに移動
...
[default_conf]
ssl_conf = ssl_sect
#add from here>>> ここから追加
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1
#add to here<<< ここまで
...
```

確認する。
```
└─$ python3 -c 'import hashlib;hashlib.new("md4", b"text");' # No error
└─$ echo 'test' | openssl dgst -md4
MD4(stdin)= 36d729ab4ff7260da6fb010ef5747bb3
```
OK。

hashlibも確認する。
```python
└─$ python3
>>> import hashlib
>>> print(sorted(hashlib.algorithms_guaranteed))
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256']
>>> print(sorted(hashlib.algorithms_available))
['blake2b', 'blake2s', 'md4', 'md5', 'md5-sha1', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'sha512_224', 'sha512_256', 'shake_128', 'shake_256', 'sm3', 'whirlpool']
```
md4がavailableになった。

最初のスクリプトは無事実行できるようになった。

:::note info
やりたい事が完了したら、念のためOpenSSLの設定は戻すことをお勧めします。
:::