济南 制作网站 公司Linux主机设置网站首页

web/2025/9/30 19:01:40/文章来源:
济南 制作网站 公司,Linux主机设置网站首页,大型企业网站优化,网站后台修改不了本文主要阐述HDFSRPC安全认证相关的实现。主要介绍Token相关的实现。 写在前面 相关blog https://blog.csdn.net/hncscwc/article/details/124722784 https://blog.csdn.net/hncscwc/article/details/124958357 Token由来 在探究完Kerberos#xff0c;我一直在想一个问题…本文主要阐述HDFSRPC安全认证相关的实现。主要介绍Token相关的实现。 写在前面 相关blog https://blog.csdn.net/hncscwc/article/details/124722784 https://blog.csdn.net/hncscwc/article/details/124958357 Token由来 在探究完Kerberos我一直在想一个问题rpcConnection已经完成了验证那为何还需要token首先需要对yarn有一定的了解我们知道mapreduce框架是把目标变成多个map然后reduce出结果。Yarn在执行多个map、reduce的时候是通过container来运行的。Container本质上是一个独立程序执行了yarn分配的任务。当Container进程要去访问hdfs的时候如果使用Kerberoskdc验证服务存在的不可靠和性能问题多机多container并发极高必然会极大的限制大数据平台的稳定尤其是当有大量用户请求需要通过kdc来获取tgt票据时。因此Token认证被引入充当kerberos的补充在兼顾安全认证的同时性能没有较大的损耗。在hadoop中token主要包括DelegationToken以及其他一些token例如之前文件介绍过的BlockToken以及yarn中一系列的token。 Token中yarn container流程图 Token的应用 当完成kerberos验证以后服务主体的可以通过getDelegationToken接口来获取token。当服务主体下面的的进程需要去访问hdfs的时候可以通过token来访问。 Token的验证也在rpc的sasl中但是步骤跟简单如下 server当收到client negotiate请求以后会返回多个auth。 auths {method: TOKENmechanism: DIGEST-MD5protocol: serverId: defaultchallenge: realm\default\,nonce\svFDnzmhsk40oN5z6vnUFgYgawR17wXvxiX1Z3M\,charsetutf-8,algorithmmd5-sess } auths {method: KERBEROSmechanism: GSSAPIprotocol: rootserverId: node17 }client接收完negotiate应答后可以通过服务主体获取的token来initSaslClient然后发送Initiate请求。Server接收到Initiate请求会通过token初始化saslServer不同于Kerberossaslserver验证完token会立马complete。这时候server会直接返回success应答给客户端。客户端接收到success应答以后即完成SaslClient的初始化。 可以看出token验证的整个过程更简单而且本质上就是server验证了一下client的token消耗更少性能更高。 token验证本身与用户密码生成没有任何关系主要都是java原生类来实现。代码如下 public class TokenTest {public static final String SASL_DEFAULT_REALM default;public static final String USERNAME tokentestuser;public static final char[] PASSWORD new char[]{1};public static void main(String[] args) throws SaslException {String mechanism DIGEST-MD5;CallbackHandler serverCallback new SaslDigestCallbackHandler();String protocol ;String serverId SASL_DEFAULT_REALM;SaslServer saslServer FastSaslServerFactory.getInstance().createSaslServer(mechanism, protocol, serverId, null, serverCallback);String saslUser null;MapString, String saslProperties new HashMapString, String();saslProperties.put(javax.security.sasl.qop, auth);saslProperties.put(javax.security.sasl.server.authentication, true);CallbackHandler clientCallback new SaslClientCallbackHandler();SaslClient saslClient Sasl.createSaslClient(new String[]{mechanism}, saslUser, protocol, serverId, saslProperties, clientCallback);byte[] response saslServer.evaluateResponse(new byte[0]);System.out.println(NEGOTIATE: new String(response));byte[] request saslClient.evaluateChallenge(response);System.out.println(INITIATE: new String(request));byte[] response2 saslServer.evaluateResponse(request);System.out.println(SUCCESS: new String(response2));System.out.println(server complete: saslServer.isComplete());saslClient.evaluateChallenge(response2);System.out.println(client complete: saslClient.isComplete());}public static class SaslDigestCallbackHandler implements CallbackHandler {Overridepublic void handle(Callback[] callbacks) throws UnsupportedCallbackException {NameCallback nc null;PasswordCallback pc null;AuthorizeCallback ac null;for (Callback callback : callbacks) {if (callback instanceof AuthorizeCallback) {ac (AuthorizeCallback) callback;} else if (callback instanceof NameCallback) {nc (NameCallback) callback;} else if (callback instanceof PasswordCallback) {pc (PasswordCallback) callback;} else if (callback instanceof RealmCallback) {continue; // realm is ignored} else {throw new UnsupportedCallbackException(callback,Unrecognized SASL DIGEST-MD5 Callback);}}if (pc ! null) {pc.setPassword(PASSWORD);}if (ac ! null) {String authid ac.getAuthenticationID();String authzid ac.getAuthorizationID();if (authid.equals(authzid)) {ac.setAuthorized(true);} else {ac.setAuthorized(false);}if (ac.isAuthorized()) {ac.setAuthorizedID(authzid);}}}}private static class SaslClientCallbackHandler implements CallbackHandler {private final String userName;private final char[] userPassword;public SaslClientCallbackHandler() {this.userName USERNAME;this.userPassword PASSWORD;}Overridepublic void handle(Callback[] callbacks)throws UnsupportedCallbackException {NameCallback nc null;PasswordCallback pc null;RealmCallback rc null;for (Callback callback : callbacks) {if (callback instanceof RealmChoiceCallback) {continue;} else if (callback instanceof NameCallback) {nc (NameCallback) callback;} else if (callback instanceof PasswordCallback) {pc (PasswordCallback) callback;} else if (callback instanceof RealmCallback) {rc (RealmCallback) callback;} else {throw new UnsupportedCallbackException(callback,Unrecognized SASL client callback);}}if (nc ! null) {nc.setName(userName);}if (pc ! null) {pc.setPassword(userPassword);}if (rc ! null) {rc.setText(rc.getDefaultText());}}} }程序运行输出 **NEGOTIATE:**realm“default”,nonce“alYJcFcQ1r8azJmG4E9Vy4HJt7AfNyJIXhGCvcD”,charsetutf-8,algorithmmd5-sess INITIATE:charsetutf-8,username“tokentestuser”,realm“default”,nonce“alYJcFcQ1r8azJmG4E9Vy4HJt7AfNyJIXhGCvcD”,nc00000001,cnonce“nA2o8sejSYExOtEt8ELnWJXob3KDHOIF2OlaxozQ”,digest-uri“/default”,maxbuf65536,responsee388c2b4a0f68f94607e01b033ef61b2,qopauth SUCCESS:rspauthaf3865533148b4f6539b785ce2958854 server complete:true client complete:true Client当收到server的negotiate response后会通过某个算法生成response然后发送initiate request。Server会通过同样的算法来生成自己的验证值来比较response成功以后会同样的算法生成rspauth。Client收到rspauth以后会用同样的算法来成自己的验证值来比较rspauth。 Token验证算法 protected byte[] generateResponseValue(String authMethod,String digestUriValue,String qopValue,String usernameValue,String realmValue,char[] passwdValue,byte[] nonceValue,byte[] cNonceValue,int nonceCount,byte[] authzidValue) throws NoSuchAlgorithmException,UnsupportedEncodingException,IOException {MessageDigest md5 MessageDigest.getInstance(MD5);byte[] hexA1, hexA2;ByteArrayOutputStream A2, beginA1, A1, KD;// A2// --// A2 { AUTHENTICATE:, digest-uri-value,// [:00000000000000000000000000000000] } // if auth-int or auth-conf//A2 new ByteArrayOutputStream();A2.write((authMethod : digestUriValue).getBytes(encoding));if (qopValue.equals(auth-conf) ||qopValue.equals(auth-int)) {logger.log(Level.FINE, DIGEST04:QOP: {0}, qopValue);A2.write(SECURITY_LAYER_MARKER.getBytes(encoding));}if (logger.isLoggable(Level.FINE)) {logger.log(Level.FINE, DIGEST05:A2: {0}, A2.toString());}md5.update(A2.toByteArray());byte[] digest md5.digest();hexA2 binaryToHex(digest);if (logger.isLoggable(Level.FINE)) {logger.log(Level.FINE, DIGEST06:HEX(H(A2)): {0}, new String(hexA2));}// A1// --// H(user-name : realm-value : passwd)//beginA1 new ByteArrayOutputStream();beginA1.write(stringToByte_8859_1(usernameValue));beginA1.write(:);// if no realm, realm will be an empty stringbeginA1.write(stringToByte_8859_1(realmValue));beginA1.write(:);beginA1.write(stringToByte_8859_1(new String(passwdValue)));md5.update(beginA1.toByteArray());digest md5.digest();if (logger.isLoggable(Level.FINE)) {logger.log(Level.FINE, DIGEST07:H({0}) {1},new Object[]{beginA1.toString(), new String(binaryToHex(digest))});}// A1// --// A1 { H ( {user-name : realm-value : passwd } ),// : nonce-value, : cnonce-value : authzid-value//A1 new ByteArrayOutputStream();A1.write(digest);A1.write(:);A1.write(nonceValue);A1.write(:);A1.write(cNonceValue);if (authzidValue ! null) {A1.write(:);A1.write(authzidValue);}md5.update(A1.toByteArray());digest md5.digest();H_A1 digest; // Record H(A1). Use for integrity privacy.hexA1 binaryToHex(digest);if (logger.isLoggable(Level.FINE)) {logger.log(Level.FINE, DIGEST08:H(A1) {0}, new String(hexA1));}//// H(k, : , s);//KD new ByteArrayOutputStream();KD.write(hexA1);KD.write(:);KD.write(nonceValue);KD.write(:);KD.write(nonceCountToHex(nonceCount).getBytes(encoding));KD.write(:);KD.write(cNonceValue);KD.write(:);KD.write(qopValue.getBytes(encoding));KD.write(:);KD.write(hexA2);if (logger.isLoggable(Level.FINE)) {logger.log(Level.FINE, DIGEST09:KD: {0}, KD.toString());}md5.update(KD.toByteArray());digest md5.digest();byte[] answer binaryToHex(digest);if (logger.isLoggable(Level.FINE)) {logger.log(Level.FINE, DIGEST10:response-value: {0},new String(answer));}return (answer);}本质上是把用户名密码和一些参数放入MD5.update之中最终生成一个MD5值。 值得注意的是生成response和rspauth时只有第一个参数authMethod不一样一个为 AUTHENTICATE一个为空字符串。 digestResp.write(generateResponseValue(AUTHENTICATE,digestUri, negotiatedQop, username,negotiatedRealm, passwd, nonce, cnonce,nonceCount, authzidBytes));byte[] expected generateResponseValue(,digestUri, negotiatedQop, username, negotiatedRealm,passwd, nonce, cnonce, nonceCount, authzidBytes); Token的统一管理 Hadoop中Delegation Tokens的生成和验证主要依赖于HMAC机制。但是实际的实现可以自定义。主要原因是由于生成和验证都是在server端实现。Token相关的rpc接口如下 TokenDelegationTokenIdentifier getDelegationToken(Text renewer) throws IOException; long renewDelegationToken(TokenDelegationTokenIdentifier token) throws IOException; void cancelDelegationToken(TokenDelegationTokenIdentifier token) throws IOException;一般的密码生成实现是生成用户名密码存入数据库然后通过查表验证。Token的实现略有不同由于是HMAC来生成密码所以密码是实时生成的但是要保存HMAC的key类似于AES256算法的keykey也不是固定的是会变化的所以要记录key。所以Token的持久化主要是持久化key和Token也是通过proto格式来存在fsimage.proto中。 message SecretManagerSection {message DelegationKey {optional uint32 id 1;optional uint64 expiryDate 2;optional bytes key 3;}message PersistToken {optional uint32 version 1;optional string owner 2;optional string renewer 3;optional string realUser 4;optional uint64 issueDate 5;optional uint64 maxDate 6;optional uint32 sequenceNumber 7;optional uint32 masterKeyId 8;optional uint64 expiryDate 9;}optional uint32 currentId 1;optional uint32 tokenSequenceNumber 2;optional uint32 numKeys 3;optional uint32 numTokens 4;// repeated DelegationKey keys// repeated PersistToken tokens }独立站原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝网站建设的策划书做阀门网站电话

一、虚拟地址转换成物理地址 涉及到的部件: MMU:虚拟地址—MMU—>物理地址。MMU会控制整个流程(查快表、查慢表等等)TLB快表:组号(若为组相联TLB)、TLB标记、有效位、页框号页表&#xff08…

网站建设 网站开发 区别做网站开发需要什么技能

2019独角兽企业重金招聘Python工程师标准>>> 欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。 删除元素 删除元素本身比较简单,就是采用二叉树的删除规则。 (1)如果删除的位置有两…

小企业网站 优帮云网站的设计与制作

目录 一、概述 二、持续集成的典型操作流程 2.1 概述 2.2 持续集成的操作流程图 2.3 持续集成关键流程说明 三、构建持续集成流水线的方式 3.1 依托云厂商能力 3.2 采用开源产品 3.3 企业自研 四、构建持续化集成流水线 4.1 基于GitHub的持续集成流水线(公…

江苏鑫圣建设工程有限公司网站营销公司排行

变量命名的规范,对于我们编程,大家都知道是非常重要的,上次给大家推荐过一个命名辅助工具《程序员还在为变量取名苦恼,那是因为你不知道,这个变量命名神器》,但大家一致反馈存在2个问题:1、网速…

台州网站平面设计做网站哪些方面会侵权

之前使用 html2canvas 和 jsPDF 实现html转pdf,但是客户说不能复制pdf中的文字,要改一下,先说不能复制的方法,再说可以复制的方法 一,html2canvas 和 jsPDF(图片插入pdf不可复制) 创建pdf.js文…

如何快速找到做网站的客户河北石家庄网络公司

目录 1.1 三张报表的作用 1.2 三张报表长的样子 1.2.1 资产负债表 1.2.2 利润表 1.2.3 现金流 1.3 BI指标构建 1.3.1 盈利能力指标构建 1.3.2 营运能力指标构建 1.3.3 偿债能力指标构建 转眼间,一年又悄然而逝,时光荏苒,岁月如梭 &a…

各类大型网站建设变身变装 wordpress

假如按工业交换机的端口号构造来分,工业交换机大概可分成:固定不动端口号工业交换机和模块化设计工业交换机二种不一样的构造。实际上也有一种是二者兼具,那便是在出示基础固定不动端口号的基本以上再配置一定的拓展扩展槽或控制模块。今天&a…

wordpress网站搬迁黄浦做网站

目录 1、简介 2、添加WS配置 3、发送请求 4、处理请求 5、常用模式和用例 6、自定义BodyReadables和BodyWritables 6、独立WS 7、访问AsyncHttpClient 8、配置WS 1、简介 有时我们想从一个play应用程序中调用其他HTTP服务。Play提供了WS库来进行异步HTTP方法调用。 …

上虞网站建设文广网络域名买卖网站

基本的XML Schema的使用就是这样,下面我们要介绍XML Schema的另外一个核心的部分也是Schema最关键的一个部分,就是关于Schema的名字空间(namespace)的问题。在上面关于XML Schema的介绍中,为了把读者集中到对XML Schema的语法理解上&#xff…

网站与网页的区别最新网站架构

小编杂谈新能源已经完成了至少5期的博文了,Boss告诉小编,如果还不介绍我们的产品和方案,黄花菜都凉了,所以小编这期博文就重点介绍一下Microchip在储能上的产品介绍,重点聊聊Microchip储能中使用的光伏逆变器的解决方案…

国外创意海报设计网站seo 网站标题长度

struts2 1-1:为什么每次请求都要创建一个Action对象? 是出于对线程安全的考虑,每个request都不会相互影响 1-2:ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题? 先把旧的model对象从ValueStack…

缅甸网站后缀公司刚做网站在那里找图片做

我们经常在实际开发中会用到一些转换类,比如在金融界中,我们需要将1转换为“壹”,2转换成“贰”。还有类似这样的需求,食堂在一周内每天的菜单都是不一样的,周一为鱼香肉丝鸡腿,周二为爆炒土豆丝鲅鱼&#…

深圳定制网站制作报价北京网站建设推荐华网天下

C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos。 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int fseek(FILE *fp, long offset, int fromw…

临沂制作手机网站怎样下载广安同城app

本文主要介绍如何在 GitHub Codespaces 这个云上 IDE 环境中安装 .NET 7背景GitHub 的 Codespaces 可以让我们随时随地编写代码,一些简单的修改也非常方便快捷。特别是 .NET 7 发布后,一些可以直接升级的小项目只需要更改配置就可以了,我们可…

大连网站推广工具杭州二建建设有限公司网站

​​题目来源: leetcode题目,网址:面试题 01.04. 回文排列 - 力扣(LeetCode) 解题思路: 对字符串中各字符计数,若个数为奇数的字符个数大于 1,则不是回文排列,否则是。 …

怎样通过网址浏览自己做的网站网站支付页面怎么做的

在 Java Web 应用中,高并发环境会带来一系列的挑战,这些挑战可能会影响应用的性能、稳定性和可用性。下面是一些常见的问题以及相应的解决方案: 1. 线程资源竞争 问题: 当多个线程尝试同时访问同一资源时,可能会导致竞争条件,进而影响数据的完整性。 解决方案: 使用同步…

经营网站挣钱深圳企业网查询

您可于2024年6月10日至14日前往美因河畔法兰克福11.0号馆,Softing将在C25展位展出,欢迎莅临! 作为工业应用中数据交换领域公认的专家,Softing工业致力于帮助各行各业的客户部署网络自动化和优化生产流程。 使用Softing产品&…

【转】网页 网站 html如何实现"关闭窗口"代码大全设计工作室取什么名字好

0x01 产品简介 金蝶 Apusic 应用服务器(Apusic Application Server,AAS)是一款标准、安全、高效、集成并具丰富功能的企业级应用服务器软件,全面支持 JakartaEE 8/9的技术规范,提供满足该规范的 Web 容器、 EJB 容器以及 WebService 容器等,支持 Websocket 1.1、Servlet…

卖产品怎么做网站用什么软件制作网站

对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。那么,有什么办法可以避免在代码中写大量的判空语句呢?有人说可以使用 JDK8提供的 Optional …

考试类网站如何做中国质量建设协会网站

如果您是一位 C/C 开发人员,那么您一定知道在编写和维护大型项目时所面临的挑战。这些项目通常包含大量的源代码、库和依赖项,需要耗费大量的时间和精力才能构建和维护。在这种情况下,使用自动化工具可以大大减轻您的负担,提高项目…