登录系统的『紧急口令』应该以什么原则选用为好? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
MFWT
V2EX    程序员

登录系统的『紧急口令』应该以什么原则选用为好?

  •  2
     
  •   MFWT 2023-06-18 10:08:02 +08:00 via Android 4217 次点击
    这是一个创建于 844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    嗯,最后我还是去广州旅行了,在被称为世界最高城的动漫星城晃悠去了

    背景

    动漫星城没到点没开门,在外面瞎转悠

    然后,看到了有关一个软件的安装教程,想装起来试试

    打开 JuiceSSH ,准备登录的时候才想起个问题:这台服务器我关掉了密码登录,只能密钥登录,但是我出门在外,并没有给手机上的 SSH 软件装载私钥

    是的,我暂时登录不上这台服务器了

    设想

    密码登录(或者说,口令登录)的痛点在于容易被人爆破密码,那么如果我设定一个足够强的密码,理论上应该可以大幅度减轻这个问题严重程度?

    为了方便记忆和推算,我设想中用的是

    k = to_lower(sha256(s)) 

    其中 s 是我记得的一个比较高强度的口令( 14 个字符,大小写特殊符号和数字都有)

    当然,我知道,这个做法的安全性,比不上用完一次即失效的『紧急登录刮刮码』

    那么问题来了:

    1. 这种方法会比直接使用原来的口令要安全吗?
    2. 是否应该在 hash 的时候手动对口令进行加盐处理(比如,该机器的 IPv4 地址的第一段)?
    3. SHA256 是否可以满足『认为是安全的』的口令长度的需求?

    谢谢解答

    第 1 条附言    2023-06-18 11:48:09 +08:00
    更进一步:

    4. 如果把上述算法中的 to_lower 替换为 base64 ,是否可以起到增加密码熵的作用?

    5. 续 4 ,如果把`sha256(pwd+salt)`,换成成品的 KDF 算法(仅考虑 Javascript 实现),是否增加一定的安全性?
    36 条回复    2023-06-19 10:52:41 +08:00
    vitovan
        1
    vitovan  
       2023-06-18 10:11:09 +08:00
    答不上来。

    感觉你已经都懂了。
    dingwen07
        2
    dingwen07  
       2023-06-18 10:15:55 +08:00 via Android   1
    我选择直接把私钥放到物理安全密钥里
    tmtstudio
        3
    tmtstudio  
       2023-06-18 10:18:16 +08:00
    我都是端口指定 IP 访问,用手机的话临时放行一下
    codehz
        4
    codehz  
       2023-06-18 10:18:45 +08:00 via iPhone   1
    我的建议是,用联网同步的密码管理器(
    geelaw
        5
    geelaw  
       2023-06-18 10:26:37 +08:00
    从密码学角度考虑,口令登录相比密钥登录的问题并不在于“容易被人猜出口令”,而是:(1) 获得一次成功认证过程的明文即可反复重新认证;(2) 服务器被攻击后更容易还原口令。

    使用高强度口令可以避免第二个问题,然而我的看法是发送 s 并不比发送 to_lower(sha256(s)) 更糟糕,两者口令的熵是一样的。口令长度不是安全性的源泉,只是代理指标而已,口令强是指它的熵高,而长度和熵的关系是 熵 <= 长度好的口令一定要长,但长的口令不一定好。
    pluto1
        6
    pluto1  
       2023-06-18 10:39:46 +08:00 via iPhone
    你用 sha256 其实有点类似于最简单的 KDF ,建议看看 scrypt 之类的,感觉理论上安全性可以稍微高一点
    dode
        7
    dode  
       2023-06-18 10:43:17 +08:00
    ssh 启用两步验证,然后可以搞几个一次性应急?
    1map
        8
    1map  
       2023-06-18 10:52:25 +08:00
    我的密码是派 取前 200 位,每次进入系统都要手动打几分钟,但是安全啊
    mengyx
        9
    mengyx  
       2023-06-18 10:57:18 +08:00 via Android
    建议搞两个安全密钥,随身带着一个;
    这之后我就没碰到过类似问题
    caesarding07
        10
    caesarding07  
       2023-06-18 10:59:14 +08:00
    我都是用网盘直接存密钥的,用的时候就直接下载密钥。
    mingl0280
        11
    mingl0280  
       2023-06-18 11:03:06 +08:00 via Android
    密码越长越好,但是与密码本身使用了多少次不同的字符几乎没有关系。一个 32 个英文字符加几个数字和符号的密码被爆破的难度远高于一个 12 位随机字符串的密码。
    laozhoubuluo
        12
    laozhoubuluo  
       2023-06-18 11:05:14 +08:00
    1. 从密码学的角度 hash 算法会降低信息熵,算法套算法可能存在额外的安全隐患(因为算法套算法的安全性大概率没有数学论证也没有专家测试)。但如果只考虑 SSH 暴力破解这一个维度那其实不太好说,毕竟 sha256 里面没有特殊字符但是一般暴力破解也不会考虑 256 位长度。
    2. 信息熵的增加一定能增强安全性,甚至不考虑 hash 直接使用 口令+IP 地址 或者 口令+计算机名 的形式都要比只使用口令要安全。
    3. 256 位数字+小写字母应该够安全了。
    MoeMoesakura
        13
    MoeMoesakura  
       2023-06-18 11:11:15 +08:00
    我反正一直取 uuid 作为密码,爆开还是很难的
    zhleonix
        14
    zhleonix  
       2023-06-18 11:25:34 +08:00
    简单数字密码,然后映射到某段经文对应的词(中文的用拼音),很难爆破。
    leaflxh
        15
    leaflxh  
       2023-06-18 12:49:53 +08:00   1
    echo dick | sha512sum
    be79819833110c0847abb4f6491ccd97daed271e04e6b18d2651a709f65efd1c209c2b94fc2477af34d72968fa0a32e69031ee6bcf6028be59f04971e480689d -
    Radeon
        16
    Radeon  
       2023-06-18 12:58:31 +08:00
    k = to_lower(sha256(s))
    足够了。这里的关键是输出位数够长就行
    ltkun
        17
    ltkun  
       2023-06-18 12:58:43 +08:00 via Android
    说明你平时没有使用手机登陆服务器的习惯 我基本上大半时间都是手机登陆的
    wangxiaoaer
        18
    wangxiaoaer  
       2023-06-18 13:04:52 +08:00 via iPhone
    好家伙,看到紧急登陆还以为又出现什么新技术了呢。
    MFWT
        19
    MFWT  
    OP
       2023-06-18 13:12:55 +08:00 via Android
    @ltkun 确实是没有的,平时几乎是 PuTTY 操作,键盘打字总比搓屏幕舒服
    vain
        20
    vain  
       2023-06-18 13:28:57 +08:00
    思路是一样的思路,但是可以用一个更好更容易被记住的方式:
    如先设定一个基础密语 S
    然后做如下步骤:
    S1=to_lower(sha256(S));

    取 S1 最后 8 位(或其它位数,自己记住)为 S1.0
    然后
    S1.1 =S1.0+CurrentDate //比如今天就是在字符串后边加上 6 个字符"20230618",这个日期可以设为每次更改这个密码的时间,只要你在自己的账号记录里记下每次更改密码的日期就行,而且这个信息对不知道的人来说也不知道是 SALT 。

    然后
    P = to_lower(sha256(S1.1));

    最终密码可以设为 P 的最后 16 位或 24 位字符 //S1.0 的 N 倍,N 你自己心里记住。

    基础密语 S 是最关键的,也需要自己记忆,但是有一些好办法,比如用自己才知道的事情做一个提示。
    比如下边的例子:
    “收一台八九成新的 64G 存储的 iPhone 二手手机,有的自己报价,报价请用七个 的汉字描述”(这段提示语写在一个地方备忘,甚至可以把它藏在某个过去日期的日记本里,就伪装成过去发过的二手信息的记录,当然你自己要知道去哪里找)
    然后语 S 就是那 7 个指定编码的汉字字符。
    Puteulanus
        21
    Puteulanus  
       2023-06-18 13:51:50 +08:00
    https://userify.com
    以前用过,等于对所有服务器接受的 SSH 公钥进行集中管理,界面有点简陋不过用着还行
    14v45mJPBYJW8dT7
        22
    14v45mJPBYJW8dT7  
       2023-06-18 13:54:31 +08:00
    把自己的生日 hash 1000 次
    zackwu
        23
    zackwu  
       2023-06-18 15:12:07 +08:00
    obfuscation is not security

    用各种奇技淫巧对密码做各种处理,不论是 sha256 还是 base64 ,本质上只是混淆,并不能增加密码的安全性。

    但回到问题本身,s 本身已经是高强度密码,所以开心就好……做不做这些都没啥区别
    Maboroshii
        24
    Maboroshii  
       2023-06-18 15:25:59 +08:00 via Android
    没有人知道你的口令放在哪里,比如,你可以写在鞋垫子上
    TigerK
        25
    TigerK  
       2023-06-18 15:43:28 +08:00
    两步验证吧,就是需要输入一组只有 30 秒有效期的数字作为另一道防线。
    caomingjun
        26
    caomingjun  
       2023-06-18 15:55:26 +08:00 via Android
    以我目前的架构,我可以以 yubikey 的 FIDO 加上一段短密码为凭证,向 SSH CA 请求签发有效期两分钟的证书
    但是我好像没这种需求
    laqow
        27
    laqow  
       2023-06-18 16:10:58 +08:00
    会不会给 VPN 设强密码,服务器密码 123456 简单一些?
    rekulas
        28
    rekulas  
       2023-06-18 16:24:04 +08:00
    你感觉 sha256 弱是因为大多是 hex 展示的,本身字符集就只有 16 个同长度自然看起来要弱点,但你完全可以直接用 base64 或者自研 basexxx 算法来映射,安全性就高了
    例如我的 vps1 的密码种子是: 黑 5 打折买的廉价美国 vps
    sha256(hex): e1e2b03f23a306a6104dfa6bd976e365eb553f4d56c33cc867bfadb861705618
    sha256(base64): 4eKwPyOjBqYQTfpr2XbjZetVP01WwzzIZ7+tuGFwVhg=
    自研映射(base128?): Nz$puJtF7^jKFDy6@m(7-*)...
    danhahaha
        29
    danhahaha  
       2023-06-18 16:48:25 +08:00
    可以使用一个 [ 固定的复杂密码+当前(月日时分)的时间 ] 组合之后再加密的密码,这样的话,这个密码只有你自己知道,而且任何时候都不一样,强度也足够
    swulling
        30
    swulling  
       2023-06-18 16:52:16 +08:00 via iPhone
    非要用密码的话,可以用双因素验证。

    一个简单的方案就是密码加 google/microsoft 验证器。
    cosette
        31
    cosette  
       2023-06-18 17:05:07 +08:00
    仅考虑密码口令本身的强度的话,难记的密码强度不一定高,折中的办法是选择 8 个单词配合数字,长度足够长,也容易记忆。

    类似于这里的 passphrase 生成方法,多记忆几次就熟悉了。
    cosette
        32
    cosette  
       2023-06-18 17:05:55 +08:00
    nznd
        33
    nznd  
       2023-06-18 17:09:42 +08:00
    为了应对这个情况我做了一个快捷指令可以扫码添加 ssh key (提前把快捷指令的 pub key 添加进去)
    MFWT
        34
    MFWT  
    OP
       2023-06-18 17:39:44 +08:00
    @laqow 因为有服务器在境外,VPN 连接容易受到干扰,所以暂不考虑这个
    p1gd0g
        35
    p1gd0g  
       2023-06-19 10:52:15 +08:00
    两步验证不好吗
    lisxour
        36
    lisxour  
       2023-06-19 10:52:41 +08:00
    使用无密码方案
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3608 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 00:48 PVG 08:48 LAX 17:48 JFK 20:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86