必须使用 jupyter 自带的 passwd() 函数生成密码哈希,不可手写或拼接;新版本默认 argon2 算法,兼容性问题可强制指定 algorithm='sha1';生成后完整填入配置文件 c.notebookapp.password = 'xxx' 中。

直接用 passwd() 生成,别手写或拼接
哈希值必须由 Jupyter 自带的 passwd() 函数生成,不能手动构造、复制旧值、或用其他工具(如 sha1sum)伪造。它内部使用加盐哈希(默认是 argon2,老版本用 sha1),每次结果都不同,且校验逻辑强耦合于 Jupyter 的认证流程。
passwd() 在不同环境下的调用方式
核心是进入 Python 环境并导入函数,但具体路径和命令取决于你用的是什么环境:
- 本地 Miniconda/Anaconda:直接运行
python3,然后执行from notebook.auth import passwd; - WSL2 中:确保已激活对应 conda 环境(如
conda activate base),再进 Python; - Docker 容器内:用
docker exec -it <container_id> python3</container_id>,再导入; - JupyterLab 0.35+ 或新版 Notebook:
passwd()默认可用,但若报错ModuleNotFoundError,说明notebook包未安装或版本过低,需pip install notebook。
为什么有时生成的是 argon2 而不是 sha1
新版本 Jupyter(≥6.0)默认用 argon2 算法,更安全但部分旧部署(如某些 Docker 镜像或 CI 环境)可能不兼容。如果登录失败或提示“invalid password”,大概率是算法不匹配。
- 强制指定
sha1:调用时传参passwd(algorithm='sha1'); - 确认当前默认算法:执行
passwd?(IPython 中)或查文档; - 不要删掉哈希前缀(如
argon2:$...或sha1:...),Jupyter 靠它识别算法类型; - 配置文件里写入的必须是完整字符串,包括冒号和两段 hex 值。
生成后怎么塞进配置文件
不是把密码明文写进去,而是把整个哈希字符串赋给 c.NotebookApp.password。
- 先确保配置文件存在:运行
jupyter notebook --generate-config; - 编辑
~/.jupyter/jupyter_notebook_config.py,找到或添加一行:c.NotebookApp.password = 'sha1:xxx:yyy'; - 注意单引号必须存在,且不能有多余空格或换行;
- 如果之前已有该行但被注释了(
# c.NotebookApp.password = ...),要取消注释; - 改完保存,重启
jupyter notebook进程——旧进程不会自动重载配置。
真正容易被忽略的是:哈希值本身带算法标识,而 Jupyter 启动时会根据这个标识选择对应解密逻辑;哪怕密码对,算法不匹配也会静默拒绝登录,连错误提示都不给。











