双因子认证解决方案

什么叫双因子认证?

通俗的讲,一般的认证方式都是用户名/密码的方式,也就是只有密码这一个因子来作认证,双因子无非是增加一个因子,增强认证的安全性。

常见解决方案

  • 短信方式
  • 邮件方式
  • 电话语音方式
  • TOTP解决方案

前三种方案,其实都大同小异。Server端通过某种算法生成一段随机密码,通过短信、邮件或者电话的方式传递给用户,用户把随机密码作为登录的凭证传递给Server,Server验证通过之后,就完成了一次双因子认证。但是短信和电话语音对于运营公司是有一定的成本的,除此之外有些非互联网的应用可能并不通公网,这种情况下,TOTP不失为一种好的双因子认证的解决方案。

什么是TOTP?

是Time-based One-Time Password的简写,表示基于时间戳算法的一次性密码。

如果大家玩过梦幻西游的话,那么对将军令应该不陌生,这个就是基于TOTP的一个产物。

OTP

介绍TOTP之前,先介绍下OTP

One-Time Password的简写,表示一次性密码。

OTP(K,C) = Truncate(HMAC-SHA-1(K,C))

其中,K代表密钥串;C是一个数字,表示随机数;HMAC-SHA-1表示用SHA-1做HMAC;

Truncate是一个函数,用于截取加密后的串,并取加密后串的一些字段组成一个数字。

对HMAC-SHA-1方式加密来说,Truncate实现如下:

  • HMAC-SHA-1加密后的长度得到一个20字节的密串;
  • 取这个20字节的密串的最后一个字节,取这字节的低4位,作为截取加密串的下标偏移量;
  • 按照下标偏移量开始,获取4个字节,以大端(把高位字节放在低位地址)的方式组成一个整数;
  • 截取这个整数的后6位或者8位转成字符串返回。
 public static String generateOTP(String K,
                                      String C,
                                      String returnDigits,
                                      String crypto){
        int codeDigits = Integer.decode(returnDigits).intValue();
        String result = null;

        // K是密码
        // C是产生的随机数
        // crypto是加密算法 HMAC-SHA-1
        byte[] hash = hmac_sha(crypto, K, C);
        // hash为20字节的字符串

        // put selected bytes into result int
        // 获取hash最后一个字节的低4位,作为选择结果的开始下标偏移
        int offset = hash[hash.length - 1] & 0xf;

        // 获取4个字节组成一个整数,其中第一个字节最高位为符号位,不获取,使用0x7f
        int binary =
                ((hash[offset] & 0x7f) << 24) |
                ((hash[offset + 1] & 0xff) << 16) |
                ((hash[offset + 2] & 0xff) << 8) |
                (hash[offset + 3] & 0xff);
        // 获取这个整数的后6位(可以根据需要取后8位)
        int otp = binary % 1000000;
        // 将数字转成字符串,不够6位前面补0
        result = Integer.toString(otp);
        while (result.length() < codeDigits) {
            result = "0" + result;
        }
        return result;
    }

返回的结果就是看到一个数字的动态密码。

HOTP

知道了OTP的基本原理,HOTP只是将其中的参数C变成了随机数

公式修改一下

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

HOTP: Generates the OTP for the given count

即:C作为一个参数,获取动态密码。

一般规定HOTP的散列函数使用SHA2,即:基于SHA-256 or SHA-512 [SHA2] 的散列函数做事件同步验证;

TOTP详解

TOTP只是将其中的参数C变成了由时间戳产生的数字。

TOTP(K,C) = HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

不同点是TOTP中的C是时间戳计算得出。

C = (T - T0) / X;

T 表示当前Unix时间戳

T0一般取值为 0.

X 表示时间步数,也就是说多长时间产生一个动态密码,这个时间间隔就是时间步数X,系统默认是30秒;

例如:

T0 = 0;

X = 30;

T = 30 ~ 59, C = 1; 表示30 ~ 59 这30秒内的动态密码一致。

T = 60 ~ 89, C = 2; 表示30 ~ 59 这30秒内的动态密码一致。

不同厂家使用的时间步数不同;

  • 阿里巴巴的身份宝使用的时间步数是60秒;
  • 宁盾令牌使用的时间步数是60秒;
  • Google的 身份验证器的时间步数是30秒;
  • 腾讯的Token时间步数是60秒;

应用

客户端的实现有很多,上面已经列出来了。而服务端的实现库比较少,貌似也都是非官方的实现。这里推荐一个JAVA的实现库,这是一个私人的库,介意的朋友只能自己撸轮子了。

这里基于上述的实现库,给出一段demo代码,仅供参考。

package com.github.chenqimiao.util;

import java.text.MessageFormat;

import com.warrenstrange.googleauth.GoogleAuthenticator;
import com.warrenstrange.googleauth.GoogleAuthenticatorConfig;
import com.warrenstrange.googleauth.GoogleAuthenticatorConfig.GoogleAuthenticatorConfigBuilder;
import com.warrenstrange.googleauth.GoogleAuthenticatorKey;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

/**
 * @Auther: chenqimiao
 * @Date: 2019/8/26 22:58
 * @Description: refer https://github.com/wstrange/GoogleAuth
 */
@Slf4j
public class GoogleAuthenticatorUtils {
    // 前缀
    private static final String DEFAULT_USER_PREFIX = "TOTP_USER:";
    // 用户名|密钥|发行者
    public static final String QRCODE_TEMPLATE = "otpauth://totp/" + DEFAULT_USER_PREFIX + "{0}?secret={1}&issuer={2}";
    // 默认的发行者
    public static final String DEFAULT_ISSUER = "DAS_TOTP";

    private static final GoogleAuthenticatorConfig DEFAULT_CONFIG;

    static {
        GoogleAuthenticatorConfigBuilder builder = new GoogleAuthenticatorConfigBuilder();

        // Do something here if you want to set config for GoogleAuthenticator

        DEFAULT_CONFIG = builder.build();
    }

    public static String createQrCodeContent(String username, String secret) {
        return createQrCodeContent(username, secret, DEFAULT_ISSUER);
    }

    public static String createQrCodeContent(String username, String secret, String issuer) {
        return MessageFormat.format(QRCODE_TEMPLATE, username, secret, issuer);
    }

    public static String createSecret() {
        return createSecret(DEFAULT_CONFIG);
    }

    public static String createSecret(GoogleAuthenticatorConfig config) {
        GoogleAuthenticator gAuth = new GoogleAuthenticator(config);
        final GoogleAuthenticatorKey key = gAuth.createCredentials();
        return key.getKey();
    }

    public static boolean verify(Integer totpPwd, String secret) {

        return verify(totpPwd, secret, DEFAULT_CONFIG);
    }

    public static boolean verify(Integer totpPwd, String secret, GoogleAuthenticatorConfig config) {
        GoogleAuthenticator gAuth = new GoogleAuthenticator(config);
        return gAuth.authorize(secret, totpPwd);
    }

    public static Integer getTotpPassword(String secret) {
        return getTotpPassword(secret, DEFAULT_CONFIG);
    }

    public static Integer getTotpPassword(String secret, GoogleAuthenticatorConfig config) {
        GoogleAuthenticator gAuth = new GoogleAuthenticator(config);
        return gAuth.getTotpPassword(secret);
    }

    @SneakyThrows
    public static void main(String args[]) {
        String secret = createSecret();
        String qrcodeContent = createQrCodeContent("chenqimiao", secret);
        System.out.println("qrcodeContent is " + qrcodeContent);

        Integer totpPwd = getTotpPassword(secret);
        System.out.println("Current totp password is " + totpPwd);

        boolean result = verify(totpPwd, secret);
        System.out.println("result is " + result);

    }

qrcodeContent可以通过二维码工具生成二维码,使用Google Authenticator扫描该二维码之后,就相当于为用户绑定了一个认证器。

原文地址:https://www.cnblogs.com/think-in-java/p/11443014.html

时间: 2024-10-10 13:32:07

双因子认证解决方案的相关文章

Citrix结合CKEY实现双因子认证

1.需求分析 问题描述 员工在内外网办公环境下借助Citrix访问资源各种应用资源 很多人仍然采用初始密码或者过于简单的静态密码登录 弱口令容易的内网信息系统泄漏事件 制执行员工定期更换域登录密码计划引起很多人的不满 实现目标  提升Citrix用户登录安全,消除弱身份鉴别带来的潜在信息泄漏风险 减小静态密码遗忘或定期强制更改登录密码给员工与IT管理人员带来的开销,节约企业管理成本 做到用户登录可审计,明细职责 2. 解决方案 2.1 方案介绍 CKEY动态密码认证是双因子认证的一种方式,Cit

VMware view结合CKEY双因子认证

1.需求分析 问题描述 员工在内外网办公环境下借助VMWare View访问虚拟桌面资源 很多人仍然采用初始密码或者过于简单的静态密码登录 弱口令容易的内网信息系统泄漏事件 制执行员工定期更换域登录密码计划引起很多人的不满实现目标 提升VMWare View用户登录安全,消除弱身份鉴别带来的潜在信息泄漏风险 减小静态密码遗忘或定期强制更改登录密码给员工与IT管理人员带来的开销,节约企业管理成本做到用户登录可审计,明细职责2. 解决方案 2.1 方案介绍CKEY动态密码认证是双因子认证的一种方式,

【高效运维篇】如何通过双因子认证保证堡垒机安全访问IT资源

在日常使用堡垒机进行IT运维时,用户使用账户密码登录堡垒机后,即可对其具备权限的IT资源进行相应的操作或访问.而用户的堡垒机账户密码一旦被泄露,意味着无关人员可随意访问具备权限的IT资源,企业数据安全无法保障,后果将不堪设想. 那么,我们怎样做到即使密码泄露了也能保证数据安全呢?双因子认证显然是一种行之有效的手段.双因子验证是一种安全验证过程,被用以控制敏感系统和数据的访问.在这一验证过程中,需要用户提供两种不同的认证因素来证明自己的身份,从而起到更好地保护企业数据安全. 小编在使用行云管家进行

Proxmox 双因子认证

Proxmox 双因子认证 一.Proxmox支持两种方式的双因子认证: 1.通过认证域方式实现,也就是TOTP或YubiKey OTP实现. 使用这种方式,新建用户时需要将其持有的Key信息添加到系统,不然就没办法登录.使用TOTP的用户,如果被允许先登录,可以在登录后修改TOTP信息. 如果认证域未强制要求提供双因子认证,用户也可以通过TOTP选择自行启用双因子认证.如果服务器配置了AppID,且未强制开启其他双因子认证方式,用户也可以选择使用U2F认证. 2. U2F 认证: 如需使用U2

Google双因子认证python最好的实现

这个版本应该是最好的实现,在这个上面增加四个时间点,可以用in方式进行判断避免出错. @代码的注释其实就是最好的说明 class _GoogleTwoSetpAuth(object): '''Google令牌二次认证相关''' def _get_hotp_token(self, secret, intervals_no): '''获取htop_token 内部方法 算法 :param secret 二次验证前的编码 :param intervals_no 时间间隔 ''' key = base6

如何为VPN选择合适的动态密码双因素认证方案

CKEY动态密码认证是双因子认证的一种方式,VPN用户增加动态密码认证,借助此方案可以提升VPN远程拨入安全,加强登陆用户审计. CKEY为VPN提供短信密码.硬件令牌.软件令牌.短信密码+硬件令牌混合四种双因素认证方案,相比传统VPN采用硬件令牌或USB KEY方式在便携性及用户体验都有其瑕疵,该方案可满足不同类型企业对于安全性.便捷性.可管理性.成本多种考虑,广泛被政府.运营商.金融.制造业.内外资企业等不同领域所采纳. 与传统方式相比,北京中科恒伦科技有限公司提出四种VPN结合动态密码双因

NetScaler OTP双因子身份认证登录演示

NetScaler OTP 应用场景 NetScaler OTP(one time password)是双因子身份证的一种,利用用户名密码+6位时间型令牌认证码,完成身份认证. 在以前的双因子解决方案中NetScalerGateway需要与第三方 Radius服务器集成,实现双因子认证.对于客户来说,需要额外支付双因子身份认证的费用,提高了解决方案成本. NetScaler OTP解决方案利用NetScaler 源生功能,配合手机APP  google authenticator,不需要其他成本

网络安全之身份认证---双因子身份认证技术

在一些对安全要求更高的应用环境,简单地使用口令认证是不够的,还需要使用其他硬件来完成,如U盾.网银交易就使用这种方式.在使用硬件加密和认证的应用中,通常使用双因子认证,即口令认证与硬件认证相结合来完成对用户的认证,其中,硬件部分被认为是用户所拥有的物品.使用硬件设备进行认证的好处是,无论用户使用的计算机设备是否存在***病毒,都不会感染这些硬件设备,从而在这些硬件设备内部完成的认证流程不受***病毒的影响,从而可提高安全性.但另一方面,这些额外的硬件设备容易丢失,因此,需要双因子认证:也容易损坏

odoo12之应用:一、双因子验证(Two-factor authentication, 2FA)(HOTP,TOTP)附源码

前言 双因子认证:双因子认证(2FA)是指结合密码以及实物(信用卡.SMS手机.令牌或指纹等生物标志)两种条件对用户进行认证的方法.--百度百科 跟我一样"老"的网瘾少年想必一定见过买点卡后上面送的密保(类似但不完全一样),还有"将军令",以及网银的网盾,是一种二次验证的机制:它通常是6位的数字,每次使用后(HOTP)或者一定时间后(TOTP)都将会刷新,大大加大了用户的安全性,OTP(One-Time Password)分为HOTP(HMAC-based One-