You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:09:03