V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MFWT
V2EX  ›  程序员

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

  •  2
     
  •   MFWT · 314 天前 via Android · 3562 次点击
    这是一个创建于 314 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    背景

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

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

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

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

    设想

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

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

    k = to_lower(sha256(s))
    

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

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

    那么问题来了:

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

    谢谢解答

    第 1 条附言  ·  314 天前
    更进一步:

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

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

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

    使用高强度口令可以避免第二个问题,然而我的看法是发送 s 并不比发送 to_lower(sha256(s)) 更糟糕,两者口令的熵是一样的。口令长度不是安全性的源泉,只是代理指标而已,口令强是指它的熵高,而长度和熵的关系是 熵 <= 长度——好的口令一定要长,但长的口令不一定好。
    pluto1
        6
    pluto1  
       314 天前 via iPhone
    你用 sha256 其实有点类似于最简单的 KDF ,建议看看 scrypt 之类的,感觉理论上安全性可以稍微高一点
    dode
        7
    dode  
       314 天前
    ssh 启用两步验证,然后可以搞几个一次性应急?
    1map
        8
    1map  
       314 天前
    我的密码是派 取前 200 位,每次进入系统都要手动打几分钟,但是安全啊
    mengyx
        9
    mengyx  
       314 天前 via Android
    建议搞两个安全密钥,随身带着一个;
    这之后我就没碰到过类似问题
    caesarding07
        10
    caesarding07  
       314 天前
    我都是用网盘直接存密钥的,用的时候就直接下载密钥。
    mingl0280
        11
    mingl0280  
       314 天前 via Android
    密码越长越好,但是与密码本身使用了多少次不同的字符几乎没有关系。一个 32 个英文字符加几个数字和符号的密码被爆破的难度远高于一个 12 位随机字符串的密码。
    laozhoubuluo
        12
    laozhoubuluo  
       314 天前
    1. 从密码学的角度 hash 算法会降低信息熵,算法套算法可能存在额外的安全隐患(因为算法套算法的安全性大概率没有数学论证也没有专家测试)。但如果只考虑 SSH 暴力破解这一个维度那其实不太好说,毕竟 sha256 里面没有特殊字符但是一般暴力破解也不会考虑 256 位长度。
    2. 信息熵的增加一定能增强安全性,甚至不考虑 hash 直接使用 口令+IP 地址 或者 口令+计算机名 的形式都要比只使用口令要安全。
    3. 256 位数字+小写字母应该够安全了。
    MoeMoesakura
        13
    MoeMoesakura  
       314 天前
    我反正一直取 uuid 作为密码,爆开还是很难的
    zhleonix
        14
    zhleonix  
       314 天前
    简单数字密码,然后映射到某段经文对应的词(中文的用拼音),很难爆破。
    leaflxh
        15
    leaflxh  
       314 天前   ❤️ 1
    echo dick | sha512sum
    be79819833110c0847abb4f6491ccd97daed271e04e6b18d2651a709f65efd1c209c2b94fc2477af34d72968fa0a32e69031ee6bcf6028be59f04971e480689d -
    Radeon
        16
    Radeon  
       314 天前
    k = to_lower(sha256(s))
    足够了。这里的关键是输出位数够长就行
    ltkun
        17
    ltkun  
       314 天前 via Android
    说明你平时没有使用手机登陆服务器的习惯 我基本上大半时间都是手机登陆的
    wangxiaoaer
        18
    wangxiaoaer  
       314 天前 via iPhone
    好家伙,看到紧急登陆还以为又出现什么新技术了呢。
    MFWT
        19
    MFWT  
    OP
       314 天前 via Android
    @ltkun 确实是没有的,平时几乎是 PuTTY 操作,键盘打字总比搓屏幕舒服
    vain
        20
    vain  
       314 天前
    思路是一样的思路,但是可以用一个更好更容易被记住的方式:
    如先设定一个基础密语 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 二手手机,有的自己报价,报价请用七个 GB2312 的汉字描述”(这段提示语写在一个地方备忘,甚至可以把它藏在某个过去日期的日记本里,就伪装成过去发过的二手信息的记录,当然你自己要知道去哪里找)
    然后密语 S 就是那 7 个指定编码的汉字字符。
    Puteulanus
        21
    Puteulanus  
       314 天前
    https://userify.com
    以前用过,等于对所有服务器接受的 SSH 公钥进行集中管理,界面有点简陋不过用着还行
    rimutuyuan
        22
    rimutuyuan  
       314 天前
    把自己的生日 hash 1000 次
    keith1126
        23
    keith1126  
       314 天前
    obfuscation is not security

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

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

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

    类似于这里的 passphrase 生成方法,多记忆几次就熟悉了。
    cosette
        32
    cosette  
       314 天前
    nznd
        33
    nznd  
       314 天前
    为了应对这个情况我做了一个快捷指令可以扫码添加 ssh key (提前把快捷指令的 pub key 添加进去)
    MFWT
        34
    MFWT  
    OP
       314 天前
    @laqow 因为有服务器在境外,VPN 连接容易受到干扰,所以暂不考虑这个
    p1gd0g
        35
    p1gd0g  
       313 天前
    两步验证不好吗
    lisxour
        36
    lisxour  
       313 天前
    使用无密码方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2933 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:04 · PVG 21:04 · LAX 06:04 · JFK 09:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.