【】目前,在大多情况下,尤其是对于企业级应用、或处理敏感数据的应用(如:财务应用)场景中,多因素身份认证(Multi-factor authentication,MFA)已成为了最常见的处理方法。此外,MFA也被相关法律要求在越来越多的行业中是强制执行(尤其是在欧盟)。因此,如果您正在开发应用程序,那么大概率会以某种形式启用双(或多)因素身份认证。
在本文中,我将向您展示如何为使用Spring Webflux,来构建的响应式API,以实现两因素身份认证。该应用主要使用电子邮件和密码对作为第一安全因素,并采用用户设备上应用程序(如:Google Authenticator)所生成的一次性代码(TOTP)作为第二安全因素。
两因素身份认证是如何工作的
从技术上讲,两(或多)因素身份认证是一个安全过程,用户必须提供两个或更多安全因素来让自己得到认证。也就是说,用户需要提供除密码以外的另一个标识符,例如:一次性密码、硬件令牌、生物特征(如:指纹)等。
该安全过程涉及到如下步骤:
由此可见,与使用短信传递口令代码相比,使用诸如Google Authenticator、Microsoft Authenticator、以及FreeOTP等身份认证应用,既能够避免SIM卡遭受攻击(请参见–
,又能够无需蜂窝网络或互联网连接,进行正常认证。
应用示例
下面,我们将逐步构建一个使用两因素身份认证技术的简单REST API。该API要求用户提供电子邮件密码对,和由应用生成的短代码。在此,我使用Android版的Google Authenticator来生成TOTP。其源代码的github库链接为–
。该应用会用到JDK 11、Maven、以及用于存储用户个人信息的MongoDB。其项目组织结构如下图所示:
应用示例的项目结构
在此,我不会遍历地介绍每一个组成部分,而只会专注于AuthService、TokenManager和TotpManager。这些部分主要负责身份的认证流程。它们分别提供了以下功能:
由于在此仅关注认证组件,因此我们将从用户的创建过程(注册)开始,同时涉及到密钥的生成和令牌的颁发。接着,我们将进入登录流程,涉及一个由用户提供的短代码的断言。
实现注册流程
下面,我们将完成一个注册的过程,其中涉及以下步骤:
我将主要的业务逻辑(AuthServiceImpl)与令牌的生成,以及密钥的产生分离开来。
一般步骤
主要组件AuthServiceImpl会接受SignupRequest,并返回SignupResponse。在后台,它负责整个注册的逻辑。下面是具体的实现代码:
下面,让我们逐步解读上述实现的过程。在逻辑判读中:如果当前用户是新用户,我们将对其进行注册;如果该用户已经存在于数据库之中,那么我们就必须拒绝该请求。具体步骤为:
相比以漏洞和安全问题而闻名的SHA函数,我在此选用jBcrypt库(请参见–,来产生各种安全的哈希和salt(盐)。如不你不太熟悉jBcrypt的话,请参见教程–
,以获取更多信息。
生成密钥
接下来,我们需要实现一个用来生成新的密钥的函数。它是由TotpManager.generateSecret()内部抽象而来。下面是它的代码:
测试
实现了注册逻辑之后,我们需要测试它是否能够按预期进行认证。首先,让我们调用signup端点以创建一个新的用户。其结果对象应当包含我们需要添加到应用生成器(如:Google Authenticator)的userId、令牌和密钥:
成功注册
不过,我们应当禁止同一封电子邮件两次进行注册。在此,我们通过断言,以保证应用在创建新用户之前,去检查现有的电子邮件列表:
登录响应对象
登录
下面,我们来讨论登录流程。该流程包括两个主要部分:认证电子邮件的密码凭据,以及认证由用户提供的一次性代码。和上一节一样,我们首先介绍登录所涉及的步骤:
而JWT的生成过程与注册的过程比较类似。
一般步骤
作为该示例的功能重点,AuthServiceImpl.login将实现主要的业务逻辑。首先,我们需要通过在数据库中请求电子邮件,来查找用户;否则,我们需要提供带有空字段的默认值。也就是说,让user.getUserId() == null,以表示该用户并不存在,登录流程随即中止。
接着,我们需要断言密码的匹配。当我们将密码的哈希值存储在数据库中时,就需要使用存储的salt对请求中的密码进行哈希处理,进而断言这两个值。
如果密码匹配,我们需要使用之前存储的密钥值来认证提交的代码。认证成功与否的结果,将在产生JWT和创建LoginResponse对象后得出。以下便是此部分的最终源代码:
可见,后台的逻辑步骤为:
断言一次性代码
为了认证由应用生成的一次性代码,我们必须向TOTP库提供相应的代码和密钥,并将它们保存为用户实体的一部分。具体代码如下:
测试
最后,我们可以通过测试,以认证登录的过程是否如期运行。我们将由Google Authenticator生成的代码作为登录请求的负载,去调用login端点。
如下图所示,为了检查处密码错误的情况,我们需要将进程终止在密码断言阶段:
由于密码错误,登录被拒绝
至此,我们已经创建了一个简单的REST API,它可以通过Spring Webflux(请参见–
的TOTP来提供两因素身份认证。如前文所述,为了更专注于身份认证的逻辑,我们省略了所有的其他部分。
如果您对该示例的完整代码感兴趣,请参见–。
参考文献
登山绳多少钱啊,质量怎么样
登山绳一般在40块钱左右,攀登绳索必须有UIAA认证,只要有了UIAA的认证,质量就可以保证了。
但是登山的绳索一般分为这几类:A.半静力绳(Semi-static rope)
为探洞(caving)和探谷(canyoning)设计,它们弹性中等,能够吸收制止一些有限坠落的能量。
B.动力绳(Dynamic rope)
*其技术特征和动力贮备(dynamic raservers),它能减缓冲击力,吸收坠落能量。 在攀岩(climbing)和登山(mountainerring)中使用。
C.单绳(Single rope)
正象其名字所说的那样,是单根使用的。 为攀岩面设计,它最适用于近于垂直角度和不从绳索下降的路线。
D.双绳(Double rope)
双绳主要用于登山和必须*绳索下降的长路线攀岩。 (温注:双绳比单绳细,一般同时用两根,坠落危险较小时也可单根使用)。 它在保护的质量并不是十分可*时,比如冰雪环境中,表现同样是很好的。
E.孪生绳(Twin rope)
由于总是必须两股一起使用,所以实际用途十分有限,最好停止这种绳子的生产。 我们已经有了一种双绳IceLine和孪生绳同样轻。 F.不同的玩法,不同的绳子(Rope by activity)
登山、攀岩、探洞或是旅游用绳,从技术上说是分别针对不同的活动的,所以最好选择最适于你的范围和水平的绳索。
G.绳头上的标志
在绳头一般标有:
H. 绳长
I. 绳类型标志: ① 单绳 ; (1/2) 双绳 ;(00)孪生绳 ; C 探谷绳 ;O 旅游绳
J. 遵循的标准:CE 欧洲标准UIAA国际登联标准
2. 基本指标
A.冲击力(Impact force)
对单绳来说,标准规定制止一个80KG重的物体发生的坠落系数是2(温注:坠落系数见后文)的坠落过程中最大不能超过12千牛。 对双绳来说是在制止55KG系数为2的坠落中不超过8千牛。 在经受了多次冲击和使用后,绳子的冲击力会增大。 你所选用绳子的冲击力越小,就能使用得更长久。
B.打结能力(Knotability)
一个承受10KG拉力的单结的内径必须小于绳径的1.1倍,这个数越小,绳子越柔韧。
C.下坠次数(Number of falls)
为满足标准,绳子必须能连续承受5次系数为2 的坠落。 可用的坠落次数随绳子使用时间而减少,所以坠落次数越大的绳子就能用得更久。 注意:双绳和单绳的坠落次数没有可比性,因为它们测试时坠落体重量不同。
D.锭数(Number of bobbins)
护套包裹在绳芯的外面,它是绳子的可见部分。 它由很多股单丝编成,每股单绕在一个锭子上,对相同的直径来说,锭数越多护套的动力性(dynamic)越好,锭数越少,越耐磨。 所以一个人为动力性更好而选择48锭的单绳(Top Gun)或为更耐磨而选择32锭的单绳(Wall Master III).
E.延展性(Extension)
在80KG的拉力下,单绳不能超过8%,双绳不能超过10%。 正是这弹性使绳子能吸收坠落能量。 延展不能太大,否则它将变成一条蹦极绳。
F.直径和重量(Diameter and weight)
直径越大的绳子一般有更长的可用期,但它们也更重更不好使。 在重量和易用性重要的线路上,最好选细些的绳子。 绳子的总体性能应做为重量和动力性能的平衡来考虑。 建议:对尺寸的测量不象重量那么精确,故最好比较绳子的重量而不是尺寸。
G.护套滑动 (Sheath slippage)
护套和线芯是两个独立的部分,若它们的结构匹配不好的话,将会有相对滑动的趋势,护套开始变形,在下降器的不断摩擦下,在绳芯周围形成松散地段和鼓包,发生了管套效应。 这种现象导致更快的磨损,特别是在上方保护或用得厉害时,它还会导致绳子阻塞在下降器或保护装置上的危险。 注释:这是唯一一项欧洲标准(EuroNorm)与国际登联(UIAA)要求不同的指标。 欧洲标准规定把2米绳子在特定装置上拉过以后,护套滑动小于40mm或2%,而UIAA更严格,要求小于20mm或1%
3. 坠落系数
坠落系数由坠落的严重程度决定。 系数越大坠落越严重。 在攀岩中,这个什是从0到2,它由下坠距离除以起作用的绳子长度计算出。 坠落的严重程度不是坠落距离的函数,而是这个比率,因为绳子越长,它可作更长的延伸来吸收坠落能量。 例如下坠5米,绳长2.5米,下坠系数是2。

4.冲击力
A.冲击力是:
坠落被制止住时传给攀登者的力量。 它也延着绳子传到保护点(anchor points)、铁锁(carabiners)和保护人(belayer)。 绳子的作用是吸收坠落能量,减小冲击力和它的作用。 绳子的选择是基本因素。 在这方面,绳子的质量是根据它导致低冲击力的能力和经受一次又一次冲击后保存谤种能力的本领来判断的。
B.最大冲击力
这是依标准所要求测量的,也就是最严重的情况:第一次坠落,系数是2。 这就是在绳子的性能指标中给出的数字。
C.冲击力的变化在连续的坠落中,绳子的动力性能减弱,冲击力加强,一条新绳的冲击力若接近标准的上限,那它就不能象另一条有更好动力性能的绳子一样用得长久。
D.冲击力太大会怎么样?
E.在受力保护点(running belay anchor)的危险
在坠落中,保护点受到两个力的作用:攀登者的和保护者的,这两者合成一股拉力。 若绳子不能吸收足够的能量,保护点的受力会很大,增加了保护点失效的危险。 低冲击力的绳子是减小保护点受力的关键。
F.保护困难
如果传给保护人的力量太大,制止坠落会更困难,绳子在保护装备里会跑得太快。
G.攀登人的危险
如果下坠没有很好地控制住,攀登人就要尝受直接后果。
攀登主绳的性能
首先,攀登绳索必须有UIAA认证。 UIAA对合格的攀登绳索有严格的要求,在此不再多说。 对单绳来讲,最重要的两条:首次冲击力不得大于12kN(坠落物重80kg),间隔五分钟(坠落系数为2)的连续坠落五次以内绳不断。 但大家不要以为同样标有UIAA的绳索性能相同。 性能差别很大,使用寿命差别也很大。 怎样去判断绳索性能的差别,主要还是从以上两方面去看:最小的首次冲击力(impact force)意味着对攀登者坠落的更好的保护(及对保护者和固定点更小的拉力),UIAA falls越高意味绳索更长的使用寿命(绳索在一次又一次坠落后保持延展性的能力)。
老男人的歌词? 谁有 啊
老男孩
演唱:筷子兄弟 原唱:ありがとう-大桥卓弥
那是我日夜思念深深爱着的人呐 I am deep in love with her, thinking of her day and night 到底我该如何表达 but how can I express myself 她会接受我吗 And will she accept me 也许永远都不会跟她说出那句话 Maybe Ill never expose my heart to her 注定我要浪迹天涯 For I am always wondering about alone and homeless 怎么能有牵挂 How can I be on tenterhooks 梦想总是遥不可及 Dreams are but dreams 是不是应该放弃 Maybe I should give up 花开花落又是一季 Flowers bloom and fade again and again 春天啊你在哪里 But where is the spring for me 青春如同奔流的江河 Youth like a swift current 一去不回来不及道别 Rushing by without saying good-bye 只剩下麻木的我没有了当年的热血 Leaving me behind, numb cold spent 看那漫天飘零的花朵 A beautiful flower faded 在最美丽的时刻凋谢 At its prime time in spring 有谁会记得这世界她来过But who cares if it ever lived in this world 转眼过去多年时间 Many years have elapsed in a brink of the eye 多少离合悲欢 Witnessing unions and departures, joy 筷子兄弟(11张)s and sorrows 曾经志在四方少年 The wondering boy envies the wild goose 羡慕南飞的雁 That flies to his home in the south before winter comes 各自奔前程的身影匆匆渐行渐远 People go in different directions, away and gone 未来在哪里平凡 But where is my future, just simple, ordinary days for me 啊谁给我答案 Oh, who can give me the answer 那时陪伴我的人啊你们如今在何方 Where are you, the girl who used to sit by my side 我曾经爱过的人啊现在是什么模样 Are you still beautiful and lovely, as the girl in my memory 当初的愿望实现了吗 Have you realized your dreams 事到如今只好祭奠吗 Maybe well let bygones be bygones 任岁月风干理想再也找不回真的我 However hard I may try, I cannot find my true self 抬头仰望这满天星河 A million stars are twinkling in the sky, and I try to find out the one 那时候陪伴我的那颗 That used to stay by me, oh my dear companion of yesterday 这里的故事你是否还记得 Do you still remember the time we shared together 生活像一把无情刻刀 Life, like a sculptors graver, cold and ruthless 改变了我们模样 has changed our shape 未曾绽放就要枯萎吗 Will the flower wither before it ever has a chance to bloom 我有过梦想 But I used to have my dream 青春如同奔流的江河 Youth like a swift current 一去不回来不及道别 rushing by without saying goodbye 只剩下麻木的我没有了当年的热血 Leaving me behind, numb, cold, spent 看那漫天飘零的花朵 A beautiful flower faded 在最美丽的时刻凋谢 At its prime time in spring 有谁会记得这世界她曾经来过But who cares if it ever lived in this world 当初的愿望实现了吗 Have you realized your dreams 事到如今只好祭奠吗 Maybe well let bygones be bygones 任岁月风干理想再也找不回真的我 However hard I may try, I cannot find my true self 抬头仰望这满天星河 A million stars are twinkling in the sky, and I try to find out the one 那时候陪伴我的那颗 That used to stay by me, oh my dear companion of yesterday 这里的故事你是否还记得 Do you still remember the happening here before 如果有明天祝福你亲爱的 If tomorrow ever comes, Ill send my best wishes to you, my dear girl
春天来了什么那是春天的什么吧。造句、不要照着课上?
1、春天来了,小草从土里探出了头,那是春天的眉毛吧。 2、春天来了,花儿朵朵盛开,那是春天的笑脸吧。 3、春天来了,柳条随风起舞,那是春天的腰肢吧。 4、春天来了,大地一片花红柳绿,那是春天的彩裙吧。 5、春天来了,小鸟叽叽喳喳地叫着,那是春天的歌声吧。 6、春天来了,树木的嫩枝轻轻地摆动,那是春天的舞蹈吧。 7、春天来了,溪水叮叮咚咚地流淌着,那是春天的节奏吧。 8、春天来了,风筝高高地飞在蓝天下,那是春天的头饰吧。 9、春天来了,春雨滴滴答答地落下来,那是春天的乐章吧。 10、春天来了,嫩芽从枝头冒了出来,那是春天的眼睛吧。 拓展资料:造句:把词组织成句子。 造句是初等学校常见语文练习内容,能提高学生的语言组织能力。
发表评论