本人在某大型国企混日子,涉及到工作主要为信息技术方面,俗称码农。前段时间,公司某人邮箱账号密码被盗,大晚上给全集团公司发钓鱼诈骗邮件。某些个员工真就上当了,上当就上当吧,结果还报警了,肯定留下报警记录。哎,年末大领导去国资委述职,少不了要被点名这次不光彩的事了。部门领导很生气,就找上我们这些底层了,要加强信息安全,准备信息安全材料,全公司上上下下学习,其中就涉及到相关二次验证的方面。这里就把Google二次验证的修改一下搬运过来。
二次验证的原理是一种双重认证机制,旨在提高账户的安全性,防止因密码泄露而导致的未经授权访问。以Google为例,它使用的OTP(One-Time Password)通常基于TOTP(Time-Based One-Time Password)或者HOTP(HMAC-Based One-Time Password)标准。通常采用TOTP。其原理如下:TOTP使用一个
共享密钥和
当前时间戳生成一个一次性密码。这个验证码通常每30秒或60秒更新一次,确保其短暂有效性,增加了安全性。其核心公式如下(百度吧,这公式实在不好打
)
其步骤如下:
下面是python实现的代码:
- import time
- import hmac
- import base64
- import struct
- import hashlib
- def generate_totp(secret, interval=30, digits=6):
- # Step 1: 将密钥解码成字节
- key = base64.b32decode(secret, True)
- # Step 2: 获取当前时间戳并计算时间步长
- current_time = int(time.time() / interval)
- # Step 3: 将时间步长转换为8字节的二进制数据
- msg = struct.pack(">Q", current_time)
- # Step 4: 计算HMAC-SHA1
- hmac_hash = hmac.new(key, msg, hashlib.sha1).digest()
- # Step 5: 动态截断
- offset = hmac_hash[-1] & 0x0F # 获取HMAC的最后一个字节的低4位
- binary_code = struct.unpack(">I", hmac_hash[offset:offset + 4])[0] & 0x7FFFFFFF # 截取31位
- # Step 6: 取模,生成6位验证码
- otp = binary_code % (10 ** digits)
- return str(otp).zfill(digits)
- # 示例:生成TOTP验证码
- secret = "JBSWY3DPEHPK3PXP" # 示例密钥,实际应用中应为每个用户生成唯一密钥
- totp_code = generate_totp(secret)
- print(f"当前的TOTP验证码是: {totp_code}")
那么,针对1024社区而言,当你点击开启二次验证是,服务器会给你一个16位的随机密钥,
一定要牢记。一定要牢记。一定要牢记。这个时候服务器端会给将这个密钥记录下来,然后你打开二次验证APP,将这个密钥输进去,然后密钥结合当前时间戳基于TOTP生成一个6位数的一次性密码,当你将这个一次性密码上传给服务器时,服务器也会通过相同的TOTP算法计算得到一个一次性6位密码,两者匹配成功,即获得验证。另外一点,无需担心你的二次验证APP故障,因为基于TOTP算法国际统一,只要任意一个基于TOTP算法得到结果都是一样的,包括我上面提供的代码,计算获得的一次性密码全都一样。因此,只要记牢你的那个16位随机密钥就行。
这里原理其实很简单,主要让不了解的人了解。毕竟人们对熟悉的事物有一种天然的信任和倾向,在很多情况下,用户更愿意接受自己理解的东西。最后,
一定要熟记自己的随机密钥,一定要熟记自己的随机密钥,一定要熟记自己的随机密钥。
赞(76)