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

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

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

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

    背景

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

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

    打开 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 二手手机,有的自己报价,报价请用七个 GB2312 的汉字描述”(这段提示语写在一个地方备忘,甚至可以把它藏在某个过去日期的日记本里,就伪装成过去发过的二手信息的记录,当然你自己要知道去哪里找)
    然后密语 S 就是那 7 个指定编码的汉字字符。
    Puteulanus
        21
    Puteulanus  
       2023-06-18 13:51:50 +08:00
    https://userify.com
    以前用过,等于对所有服务器接受的 SSH 公钥进行集中管理,界面有点简陋不过用着还行
    rimutuyuan
        22
    rimutuyuan  
       2023-06-18 13:54:31 +08:00
    把自己的生日 hash 1000 次
    keith1126
        23
    keith1126  
       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   ·   实用小工具   ·   2019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 00:46 · PVG 08:46 · LAX 16:46 · JFK 19:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.