如何在Mongo初始化shell脚本中生成BinaryField类型数据
问题解决方法
当前直接将shell生成的二进制变量$BINARY_SALT插值到MongoJS脚本中,二进制数据包含的不可见字符、特殊控制符会直接破坏JS语法,因此赋值失效。
最优解决方案
利用Mongo Shell原生支持的BinData()构造函数插入二进制数据,无需直接传递原生二进制串,修改后的完整脚本如下:
#!/bin/sh # 生成64字节随机值的hex字符串 SALT_HEX=$(xxd -u -l 64 -p /dev/urandom) # 将hex转成base64编码(适配BinData的输入要求),-w 0禁止base64自动换行 SALT_BASE64=$(echo -n "$SALT_HEX" | xxd -r -p | base64 -w 0) # 可根据你的加密逻辑调整密码哈希规则,这里示例为SHA256加盐,匹配BinaryField类型要求 PASSWORD_PLAIN="password123" PASSWORD_HEX=$(echo -n "${PASSWORD_PLAIN}${SALT_HEX}" | sha256sum | awk '{print $1}') PASSWORD_BASE64=$(echo -n "$PASSWORD_HEX" | xxd -r -p | base64 -w 0) # 注意Mongo 6.0+版本请把mongo命令替换为mongosh mongo -- "inup" <<EOF var rootUser = '$MONGO_INITDB_ROOT_USERNAME'; var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD'; var inup = db.getSiblingDB('inup'); inup.auth(rootUser, rootPassword); db.user_document.insert({ user_id: 1, email: 'toto@gmail.com', // 改用BinData存储密码,匹配定义的BinaryField类型 password: BinData(0, '$PASSWORD_BASE64'), // BinData第一个参数0为通用二进制子类型,和mongoengine BinaryField默认配置完全匹配 salt: BinData(0, '$SALT_BASE64') }); EOF
额外注意事项
- 原脚本中
password字段直接赋值明文字符串,和定义的BinaryField类型不匹配,上述示例已经同步修正为二进制存储,可根据自己实际的密码哈希逻辑调整加密步骤 - 如果使用的是MongoDB 6.0及以上的官方镜像,默认已经弃用旧的
mongo命令,需要把脚本中的mongo替换为mongosh才能正常执行
内容的提问来源于stack exchange,提问作者Baptiste
相关产品推荐
相关产品推荐

