维基百科 | 动漫花园

.:. 草榴社区 » 技术讨论区 » 浅谈论坛二次验证原理以及本地如何实现
本页主题: 浅谈论坛二次验证原理以及本地如何实现字体大小 宽屏显示 只看楼主 最新点评 热门评论 时间顺序
梁家河学霸


级别:骑士 ( 10 )
发帖:804
威望:358 点
金钱:22265 USD
贡献:1959 点
註册:2024-04-16

浅谈论坛二次验证原理以及本地如何实现

      本人在某大型国企混日子,涉及到工作主要为信息技术方面,俗称码农。前段时间,公司某人邮箱账号密码被盗,大晚上给全集团公司发钓鱼诈骗邮件。某些个员工真就上当了,上当就上当吧,结果还报警了,肯定留下报警记录。哎,年末大领导去国资委述职,少不了要被点名这次不光彩的事了。部门领导很生气,就找上我们这些底层了,要加强信息安全,准备信息安全材料,全公司上上下下学习,其中就涉及到相关二次验证的方面。这里就把Google二次验证的修改一下搬运过来。
    二次验证的原理是一种双重认证机制,旨在提高账户的安全性,防止因密码泄露而导致的未经授权访问。以Google为例,它使用的OTP(One-Time Password)通常基于TOTP(Time-Based One-Time Password)或者HOTP(HMAC-Based One-Time Password)标准。通常采用TOTP。其原理如下:TOTP使用一个共享密钥当前时间戳生成一个一次性密码。这个验证码通常每30秒或60秒更新一次,确保其短暂有效性,增加了安全性。其核心公式如下(百度吧,这公式实在不好打)
                                       
    其步骤如下:
                                 

    下面是python实现的代码:
     
复制代码
  1. import time
  2. import hmac
  3. import base64
  4. import struct
  5. import hashlib
  6. def generate_totp(secret, interval=30, digits=6):
  7.     # Step 1: 将密钥解码成字节
  8.     key = base64.b32decode(secret, True)
  9.     # Step 2: 获取当前时间戳并计算时间步长
  10.     current_time = int(time.time() / interval)
  11.     # Step 3: 将时间步长转换为8字节的二进制数据
  12.     msg = struct.pack(">Q", current_time)
  13.     # Step 4: 计算HMAC-SHA1
  14.     hmac_hash = hmac.new(key, msg, hashlib.sha1).digest()
  15.     # Step 5: 动态截断
  16.     offset = hmac_hash[-1] & 0x0F  # 获取HMAC的最后一个字节的低4位
  17.     binary_code = struct.unpack(">I", hmac_hash[offset:offset + 4])[0] & 0x7FFFFFFF  # 截取31位
  18.     # Step 6: 取模,生成6位验证码
  19.     otp = binary_code % (10 ** digits)
  20.     return str(otp).zfill(digits)
  21. # 示例:生成TOTP验证码
  22. secret = "JBSWY3DPEHPK3PXP"  # 示例密钥,实际应用中应为每个用户生成唯一密钥
  23. totp_code = generate_totp(secret)
  24. print(f"当前的TOTP验证码是: {totp_code}")
复制代码



    那么,针对1024社区而言,当你点击开启二次验证是,服务器会给你一个16位的随机密钥,一定要牢记。一定要牢记。一定要牢记。这个时候服务器端会给将这个密钥记录下来,然后你打开二次验证APP,将这个密钥输进去,然后密钥结合当前时间戳基于TOTP生成一个6位数的一次性密码,当你将这个一次性密码上传给服务器时,服务器也会通过相同的TOTP算法计算得到一个一次性6位密码,两者匹配成功,即获得验证。另外一点,无需担心你的二次验证APP故障,因为基于TOTP算法国际统一,只要任意一个基于TOTP算法得到结果都是一样的,包括我上面提供的代码,计算获得的一次性密码全都一样。因此,只要记牢你的那个16位随机密钥就行。


          这里原理其实很简单,主要让不了解的人了解。毕竟人们对熟悉的事物有一种天然的信任和倾向,在很多情况下,用户更愿意接受自己理解的东西。最后,一定要熟记自己的随机密钥,一定要熟记自己的随机密钥,一定要熟记自己的随机密钥。


赞(79)
DMCA / ABUSE REPORT | TOP Posted: 09-27 10:45 发表评论
凸起凸起


级别:禁止发言 ( 8 )
发帖:2335
威望:25 点
金钱:15585 USD
贡献:329 点
註册:2022-02-09

刚刚二次验证通过了,确实比之前安全了 
TOP Posted: 09-27 10:50 #1楼 引用 | 点评
麋鹿啾啾


级别:精灵王 ( 12 )
发帖:1327
威望:263 点
金钱:1780 USD
贡献:44775 点
註册:2022-09-11

好的,我学会了.


点评

    TOP Posted: 09-27 10:55 #2楼 引用 | 点评
    要用中文名


    级别:禁止发言 ( 8 )
    发帖:2481
    威望:274 点
    金钱:132299 USD
    贡献:0 点
    註册:2022-04-03

    楼主可否科普一点,用户的随机密钥如何保存在网站能确保安全不会被窃取?如果网站数据库被攻破,密钥也泄露,那么二次验证也就没有意义了。


    点评

      TOP Posted: 09-27 10:58 #3楼 引用 | 点评
      lyy121


      级别:圣骑士 ( 11 )
      发帖:4690
      威望:452 点
      金钱:19644 USD
      贡献:8964 点
      註册:2011-12-17

      科普贴,支持了
      TOP Posted: 09-27 11:00 #4楼 引用 | 点评
      sun1314


      级别:侠客 ( 9 )
      发帖:2045
      威望:220 点
      金钱:4799 USD
      贡献:1 点
      註册:2016-10-27

      感谢分享
      TOP Posted: 09-27 11:02 #5楼 引用 | 点评
      岸上人


      级别:禁止发言 ( 8 )
      发帖:755
      威望:76 点
      金钱:883 USD
      贡献:0 点
      註册:2024-05-03

      1024


      点评

        TOP Posted: 09-27 11:03 #6楼 引用 | 点评
        派大星一起嗨


        级别:天使 ( 14 )
        发帖:32947
        威望:55472 点
        金钱:22727 USD
        贡献:1024 点
        註册:2022-07-03
        认证: 技术区认证会员
        2022-11-23

        感谢分享,看不懂选手路过~
        ------------------------
        若将岁月开成花,人生何处不芳华




        点评

          TOP Posted: 09-27 11:03 #7楼 引用 | 点评
          小小黄鸭


          级别:圣骑士 ( 11 )
          发帖:7252
          威望:771 点
          金钱:13463 USD
          贡献:0 点
          註册:2022-07-04

          最简单直接的方法,就是身边有个懂电脑的朋友
          TOP Posted: 09-27 11:06 #8楼 引用 | 点评
          阳朔七堆山


          级别:侠客 ( 9 )
          发帖:298
          威望:149 点
          金钱:287 USD
          贡献:1100 点
          註册:2024-08-16

          服务器会给你一个16位的随机密钥——这个也泄露了怎么办?


          点评

            TOP Posted: 09-27 11:10 #9楼 引用 | 点评
            坏兔子


            级别:禁止发言 ( 8 )
            发帖:285
            威望:19 点
            金钱:1885 USD
            贡献:0 点
            註册:2018-09-18

            感谢分享
            TOP Posted: 09-27 11:19 #10楼 引用 | 点评
            wjsygxbt


            级别:精灵王 ( 12 )
            发帖:1275
            威望:148 点
            金钱:100170 USD
            贡献:50593 点
            註册:2019-09-05

            没有绝对安全  只有相对安全而已
            TOP Posted: 09-27 11:30 #11楼 引用 | 点评
            棒棒达人


            级别:精灵王 ( 12 )
            发帖:11063
            威望:1107 点
            金钱:9104 USD
            贡献:50 点
            註册:2018-09-10

            感谢分享!
            TOP Posted: 09-27 11:33 #12楼 引用 | 点评
            月亮上的猪


            级别:骑士 ( 10 )
            发帖:1469
            威望:359 点
            金钱:12294 USD
            贡献:300 点
            註册:2021-11-07

            慌得我赶紧去找我自己的随机密钥去了
            TOP Posted: 09-27 12:02 #13楼 引用 | 点评
            起飞的叽叽


            级别:骑士 ( 10 )
            发帖:3164
            威望:317 点
            金钱:176116 USD
            贡献:5 点
            註册:2019-02-01

            感谢分享
            TOP Posted: 09-27 12:09 #14楼 引用 | 点评
            布拉德·皮特


            级别:精灵王 ( 12 )
            发帖:5129
            威望:2610 点
            金钱:14612 USD
            贡献:22400 点
            註册:2024-02-10

            感谢科普
            TOP Posted: 09-27 12:12 #15楼 引用 | 点评
            放弃也是爱


            级别:骑士 ( 10 )
            发帖:2372
            威望:383 点
            金钱:13612 USD
            贡献:0 点
            註册:2019-06-05

            感谢分享
            TOP Posted: 09-27 12:38 #16楼 引用 | 点评
            一片月临城


            级别:精灵王 ( 12 )
            发帖:15998
            威望:2380 点
            金钱:10478 USD
            贡献:4925 点
            註册:2021-05-04

            感谢科普
            TOP Posted: 09-27 13:20 #17楼 引用 | 点评
            第一女流氓


            级别:新手上路 ( 8 )
            发帖:798
            威望:99 点
            金钱:1097024 USD
            贡献:1 点
            註册:2020-02-08

            1024
            TOP Posted: 09-27 13:23 #18楼 引用 | 点评
            巴黎伯伯


            级别:骑士 ( 10 )
            发帖:5306
            威望:531 点
            金钱:5761 USD
            贡献:0 点
            註册:2021-10-16

            感谢分享
            TOP Posted: 09-27 13:26 #19楼 引用 | 点评
            梁家河学霸 [楼主]


            级别:骑士 ( 10 )
            发帖:804
            威望:358 点
            金钱:22265 USD
            贡献:1959 点
            註册:2024-04-16

            回复楼上的,怎么变到这里了


            [ 此贴被梁家河学霸在2024-09-27 15:30重新编辑 ]
            TOP Posted: 09-27 14:53 #20楼 引用 | 点评
            条野佑长佐


            级别:禁止发言 ( 8 )
            发帖:2733
            威望:493 点
            金钱:1861 USD
            贡献:17178 点
            註册:2022-05-21

            老实说,看起来安全,只有一个密码,人脑能记住(每个人的密码都有其个人规律),唯一担心就是木马键盘记录。而二次验证码,密钥人脑无法记忆,只能保存在本机,或备份在不同地方,这样反而提高了丢失风险。
            相当于一个老人家,设计一个复杂的密码,自己记不住,每次输入都要拿出纸条,对着输入。
            TOP Posted: 09-27 15:25 #21楼 引用 | 点评
            梁家河学霸 [楼主]


            级别:骑士 ( 10 )
            发帖:804
            威望:358 点
            金钱:22265 USD
            贡献:1959 点
            註册:2024-04-16

            引用
            引用第3楼要用中文名于2024-09-27 10:58发表的 :
            楼主可否科普一点,用户的随机密钥如何保存在网站能确保安全不会被窃取?如果网站数据库被攻破,密钥也泄露,那么二次验证也就没有意义了。

            额,用户的随机密钥一般通过一个对称密钥加密后存到数据库中,比如你的随机密钥是123456这是你看到的。但保存到数据库的可能就是经过对称加密后的一个长度为32位的随机字符串。一般情况下,这个对称密钥会定时更新。所以即使攻破数据库也没什么用,除非数据库设计者缺乏安全远见,直接明文将密码123456保存到数据库里


            点评

              TOP Posted: 09-27 15:28 #22楼 引用 | 点评
              五部初段


              级别:侠客 ( 9 )
              发帖:2466
              威望:248 点
              金钱:94 USD
              贡献:301 点
              註册:2018-09-17

              我来给个简单版的
              import pyotp

              def get_variable(secret):
                  # 使用提供的密钥
                  secret = secret.replace(" ", "")
                  # 创建基于TOTP的对象
                  totp = pyotp.TOTP(secret)

                  return totp.now()


              点评

                TOP Posted: 09-27 15:42 #23楼 引用 | 点评
                mol0


                级别:新手上路 ( 8 )
                发帖:13
                威望:2 点
                金钱:63 USD
                贡献:0 点
                註册:2015-07-08

                感谢科普感谢分享
                TOP Posted: 09-27 15:47 #24楼 引用 | 点评
                .:. 草榴社区 » 技术讨论区

                电脑版 手机版 客户端 DMCA
                用时 0.02(s) x2, 03-14 09:20