一文搞懂Kerberos
Kerberos一词来源于古希腊神话中的Cerberus——守护地狱之门的三头犬,Kerberos是为TCP/IP 网络设计的可信第三方鉴别协议,最初是在麻省理工学院(MIT)为Athena 项目而开发的。Kerberos服务起着可信仲裁者的作用,可提供安全的网络鉴别,允许个人访问网络中不同的机器。
1. Kerberos 模型
Kerberos模型基于Needham-Schroeder的可信第三方协议,采用DES加密(也可用其他算法替代),它与网络上的每个实体分别共享一个不同的秘密密钥,知道该秘密密钥就是身份的证明。
Kerberos有一个所有客户和秘密密钥的数据库,由于Kerberos知道每个人的秘密密钥,所以它能产生一个实体证实另一个实体身份的消息。Kerberos还能产生会话密钥,只供一个客户机和一个服务器(或两个客户机)使用。会话密钥用来加密双方间的通信消息,通信完毕,即销毁会话密钥。
Kerberos 协议如下:
-
客户从Kerberos 请求一张票据许可票据(TGT,Ticket Granting Ticket)作为票据许可服务(TGS,Ticket-Granting Service),该票据用用户的秘密密钥加密后发送给用户;
-
为了使用特定的服务器,客户需要从TGS中请求一张票据,TGS 将票据发回给客户;
-
客户将此票据提交给服务器和鉴别器,如果客户的身份没有问题,服务器就会让客户访问该服务。

(1) 请求票据许可票据
客户到Kerberos:ccc,tgs。
(2)票据许可票据
Kerberos到客户:{Kc,tgs}Kc\{K_{c,tgs}\}K_c{Kc,tgs}Kc,{Tc,tgs}Ktgs\{T_{c,tgs}\}K_{tgs}{Tc,tgs}Ktgs
(3)请求服务器票据
客户到TGS:{Ac,s}Kc,tgs\{A_{c,s}\}K_{c,tgs}{Ac,s}Kc,tgs,{Tc,tgs}Ktgs\{T_{c,tgs}\}K_{tgs}{Tc,tgs}Ktgs
(4)服务器票据
TGS到客户:{Kc,s}Kc,tgs\{K_{c,s}\}K_{c,tgs}{Kc,s}Kc,tgs,{Tc,s}Ks\{T_{c,s}\}K_s{Tc,s}Ks
(5)请求服务
客户到服务器:{Ac,s}Kc,s\{A_{c,s}\}K_{c,s}{Ac,s}Kc,s,{Tc,s}Ks\{T_{c,s}\}K_s{Tc,s}Ks,
相关缩写表示如下
| ccc | 客户(机) |
| sss | 服务器 |
| aaa | 客户的网络地址 |
| vvv | 票据的有效起止时间 |
| ttt | 时间标记 |
| KxK_xKx | xxx的秘密密钥 |
| Kx,yK_{x,y}Kx,y | xxx与yyy的会话密钥 |
| {m}Kx\{m\}K_x{m}Kx | 以xxx的秘密密钥加密的mmm |
| Tx,yT_{x,y}Tx,y | 使用yyy的xxx的票据 |
| Ax,yA_{x,y}Ax,y | 从xxx到yyy的鉴别码 |
以吃饭为例,Kerbros、TGS和Server的关系如下:

2. 凭证
Kerberos使用两类凭证:票据(ticket)和鉴别码(authenticator)。
(1)票据
票据用于秘密地向服务器发送持有票据用户的身份识别,票据中还包括有一些信息,服务器能够用这些信息来确认使用票据的客户与发给票据的客户是同一个客户。
Kerberos票据的格式如下: Tc,s=s,{c,a,v,Kc,s}KsT_{c,s} = s,\{c,a,v,K_{c,s}\} K_sTc,s=s,{c,a,v,Kc,s}Ks对单个的服务器和客户而言,票据很有用。它包括客户名、服务器名、网络地址、时间标记和会话密钥。这些信息用服务器的秘密密钥加密。
客户一旦获得该票据,他便可以多次使用它来访问服务器,直到票据过期。客户无法解密票据(她不知道服务器的秘密密钥),但她可以以其加密的形式呈递给服务器。票据在网络上传送时,任何在网上窃听的人都无法阅读或修改它。
(2)鉴别码
Kerberos鉴别码的格式如下:Ac,s={c,t,key}Kc,sA_{c,s}=\{c,t,key\}K_{c,s}Ac,s={c,t,key}Kc,s客户在每次需要使用服务器上的服务时,都要产生一个鉴别码。该鉴别码包括用户名、时间际记和一个可选的附加会话密钥,它们用服务器与客户共享的会话密钥加密。与票据不同的是,鉴别码只能使用一次。客户可以根据需要产生鉴别码(它知道共享的秘密密钥)。
鉴别码可达到两个目的:
- 首先,它包括一些以会话密钥加密的明文,这表明鉴别码的发送者也知道密钥。
- 更重要的是,加封的明文包括时间标记,即使记录票据和鉴别码的窃听者无法重放它们。
3. 协议
(1)最初票据的获取
- 客户给Kerberos 鉴别服务器发送一个消息,该消息包括客户名ccc及其TGS服务器名。实际中,客户一般只是将其名字输人系统,注册程序发送该请求。
- Kerberos鉴别服务器在其数据库中查找客户。如果客户在数据库中,Kerberos便产生一个在客户和TGS之间使用的会话密钥({Kc,tgs}\{K_{c,tgs}\}{Kc,tgs}),这叫做票据许可票据。
- Kerberos 利用客户的秘密密钥加密会话密钥{Kc,tgs}Kc\{K_{c,tgs}\}K_c{Kc,tgs}Kc。然后为客户产生一个TGT向TGS证她的身份,并用TGS的秘密密钥对其加密{Tc,tgs}Ktgs\{T_{c,tgs}\}K_{tgs}{Tc,tgs}Ktgs。鉴别服务器将这两种加密的消息发送给客户。
- 客户解密第一个消息,并恢复会话密钥。客户现在可在TGT的有效期内向TGS证实她的身份。
(2)服务器票据的获取
- 客户必须为他想使用的每一项业务获得不同的票据,TGS给每个服务器分配票据。客户向TGS发送一个请求。
- TGS接收到请求后,用自己的秘密密钥解密此TGT,然后再用TGT中的会话密钥解密密鉴别码。
- TGS比较鉴别码中的信息与票据中的信息、客户的网络地址与发送的求地址,以及时间标记与当前时间。如果每一项都匹配,便允许处理该请求。
- TGS通过将客户有效的票据返回给服务器的方式来响应一个有效请求{Tc,s}Ks\{T_{c,s}\}K_s{Tc,s}Ks。TGS 还为客户和服务器产生一个新的会话密钥{Kc,s}\{K_{c,s}\}{Kc,s},此密钥由客户和TGS共享的会话密钥加密{Kc,s}Kc,tgs\{K_{c,s}\}K_{c,tgs}{Kc,s}Kc,tgs。然后将这两种消息返回给客户。
- 客户解密消息,同时得到会话密钥{Kc,s}\{K_{c,s}\}{Kc,s}。
(3)服务请求
- 客户向服务器鉴别自己的身份。客户产生一个鉴别码,鉴别码由客户名、客户网络地址和时间标记组成,用TGS为客户和服务器产生的会话密钥加密得到{Ac,s}Kc,s\{A_{c,s}\}K_{c,s}{Ac,s}Kc,s。
- 客户的服务请求由从Kerberos接收到的票据{Tc,s}Ks\{T_{c,s}\}K_s{Tc,s}Ks和加密的鉴别码{Ac,s}Kc,s\{A_{c,s}\}K_{c,s}{Ac,s}Kc,s组成。
- 服务器解密并检查票据和鉴别码,以及客户地址和时间标记。需要相互鉴别的应用中,服务器给客户返回一个包含时间标记的消息,该消息由会话密钥加密。这证明服务器知道客户的秘密密钥而且能解密票据和鉴别码。
- 客户和服务器可以用共享的密钥加密信息。
相关文章:
一文搞懂Kerberos
Kerberos一词来源于古希腊神话中的Cerberus——守护地狱之门的三头犬,Kerberos是为TCP/IP 网络设计的可信第三方鉴别协议,最初是在麻省理工学院(MIT)为Athena 项目而开发的。Kerberos服务起着可信仲裁者的作用,可提供安全的网络鉴别ÿ…...
Go爬虫学习笔记(三)
day3 04|敏捷之道:大型Go项目的开发流程是怎样的? 瀑布模式 流程: 市场调研需求分析产品设计研发实现集成与测试项目交付与维护 适用场景: 需求在规划和设计阶段就已经确定了,而且在项目开发周期内&…...
CASTEP参数设置(2)
虚拟试验(分子模拟) 在表征材料以及材料的相关性质时,只要是采用已有的理论加以解释 但是通常来说,需要采用已有的理论来进行设计和探索,伴随着工业软件的发展,应当选用仿真技术来缩小探索范围 传统试验V…...
浅谈对Promise的理解以及在工作中的应用
浅谈对Promise的理解以及在工作中的应用Promise的概念背景知识JavaScript的同步和异步JavaScript事件循环回调函数进行异步操作解决方案:PromisePromise 在工作中的运用创建PromisePromise封装AJAXPromise链式操作Promise.all()Promise.race()async和await总结Promi…...
开源|快速入门和理解并模拟实现GPS户外机器人的定位与导航
户外机器人的定位导航相对于需要建图的场景来说,是比较简单容易实现的,因为可以借助第三方地图完成定位,并在第三方地图中完成路径规划和下发航点等操作,实现的难题在于如何控制机器人完成步行和转弯。 这些在不引进RTK高精度定位…...
Java多线程系列--synchronized的原理
原文网址:Java多线程系列--synchronized的原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的synchronized的原理。 反编译出字节码 Test.java public class Test {private static Object LOCK new Object();public static int main(String[] args) {synchro…...
QEMU启动ARM64 Linux内核
目录前言前置知识virt开发板ARM处理器家族简介安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文…...
Linux->进程程序替换
目录 前言: 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言: 通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…...
最强分布式锁工具:Redisson
1 Redisson概述1.1 什么是Redisson?Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...
Java9-17新特性
Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么JDK1.9要允许接口定义私有方法呢?因为我们说接口是规范,规范时需要公开…...
电脑开机找不到启动设备怎么办?
电脑正常开机,却提示“找不到启动设备”,这时我们该怎么办呢?本文就为大家介绍几种针对该问题的解决方法,一起来看看吧!“找不到启动设备”是什么意思?可引导设备(又称启动设备)是一…...
使用langchain打造自己的大型语言模型(LLMs)
我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知,无所不能,但是由于有机器人所学习到的是截止到2021年9月以前的知识,所以当用户询问机器人关于2021年9月以后发送的事情时,它无法给出正确的答案&#x…...
assert()宏函数
assert()宏函数 assert是宏,而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression, 如果其值为假(即为0),那么它会打印出来assert的内容…...
Docker圣经:大白话说Docker底层原理,6W字实现Docker自由
说在前面: 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社群(50)中,很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer&#…...
Redis+Caffeine多级(二级)缓存,让访问速度纵享丝滑
目录多级缓存的引入多级缓存的优势CaffeineRedis实现多级缓存V1.0版本V2.0版本V3.0版本多级缓存的引入 在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中࿰…...
C#和.net框架之第一弹
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录C# 简介一、微软平台的编程二、使用VS创建第一个c#程序1、第一步2、第二步3、第三步4、第四步5、第五步C# 简介 C# 是一个现代的、通用的、面向对象的编程语言&…...
C++---背包模型---潜水员(每日一道算法2023.3.12)
注意事项: 本题是"动态规划—01背包"和"背包模型—二维费用的背包问题"的扩展题,优化思路不多赘述,dp思路会稍有不同,下面详细讲解。 题目: 潜水员为了潜水要使用特殊的装备。 他有一个带2种气体…...
C++类的成员变量和成员函数详解
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类…...
(枚举)(模拟)(位运算)116. 飞行员兄弟
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 116. 飞行员兄弟 - AcWing题库 我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦…...
详解Array.prototype.shift.call(arguments)
经常看到如下代码: function foo() {let k Array.prototype.shift.call(arguments);console.log(k) } foo(11,22) //11 Array.prototype.shift.call(arguments)的作用是: 取 arguments 中的第一个参数 一、为啥要这么写,不直接使用argume…...
CssToInlineStyles终极调试指南:解决10个常见错误与性能优化技巧 [特殊字符]
CssToInlineStyles终极调试指南:解决10个常见错误与性能优化技巧 🚀 【免费下载链接】CssToInlineStyles CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very usefull…...
从零开始:用ODrive和霍尔编码器打造你的第一个BLDC电机控制项目(Ubuntu环境)
从零开始:Ubuntu环境下用ODrive与霍尔编码器控制BLDC电机的完整指南 第一次接触无刷直流电机(BLDC)控制时,我被它高效、低噪音的特性所吸引,但复杂的控制逻辑让人望而却步。直到发现ODrive这个开源项目,它让…...
AI绘画新革命:SDXL-Turbo镜像快速上手与实战测评
AI绘画新革命:SDXL-Turbo镜像快速上手与实战测评 想象一下这样的场景:你刚输入完几个单词,屏幕上就立即呈现出对应的图像。没有等待,没有延迟,就像思维直接转化为画面一样流畅。这就是SDXL-Turbo带来的AI绘画新体验—…...
【STM32-HAL库】火焰传感器实战:从原理到智能火灾预警系统搭建(基于STM32F407ZGT6)
1. 火焰传感器原理与选型指南 火焰传感器作为火灾预警系统的"眼睛",其核心原理是利用光电效应检测火焰特有的光谱特征。我经手过的工业项目中,90%的火灾误报都源于传感器选型不当。市面上常见的火焰传感器主要分为三类: 红外型&…...
AHT20传感器数据漂移?STM32硬件I2C与软件模拟的稳定性对比测试
STM32硬件I2C与软件模拟I2C在AHT20传感器应用中的稳定性深度解析 工业级环境监测系统对温湿度数据的可靠性有着严苛要求。AHT20作为一款高精度温湿度传感器,其数据采集的稳定性直接关系到整个系统的可信度。本文将深入探讨STM32平台下硬件I2C与GPIO模拟I2C两种实现方…...
稚晖君亲自面试!智元机器人(Agibot)大模型技术面经全记录(含Transformer高频考点)
智元机器人(Agibot)大模型技术面试深度解析:Transformer核心考点与实战应答策略 当具身智能遇上大模型技术,一场关于未来机器人革命的对话正在顶尖科技公司的面试室里悄然展开。作为行业新锐的智元机器人(Agibot),其技术面试不仅考察候选人的…...
Timer-S1 正式发布:首个十亿级时序基础模型,预测性能达到 SOTA
本文约3600字,建议阅读5分钟十亿级规模化的突破,首次将时间序列预测的串行本质,融入模型架构、数据、训练全流程!在 AI 全面渗透各行业的背景下,工业企业对时序数据的应用需求已从基础查询计算,升级为设备状…...
手把手教你用两块STM32F103C8T6实现CAN总线点对点通信(附完整代码)
从零开始实现STM32F103C8T6双板CAN总线通信实战指南 在嵌入式开发领域,CAN总线因其高可靠性和实时性成为工业控制、汽车电子等场景的首选通信协议。对于初学者而言,使用两块STM32F103C8T6开发板搭建CAN通信系统是掌握该技术的经典入门项目。本文将彻底拆…...
douyin-downloader:智能化解构无水印视频批量采集的技术方案
douyin-downloader:智能化解构无水印视频批量采集的技术方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代,如何高效获取高质量视频素材成为内容创作者、研究者…...
策划和程序不再打架:Unity+Excel打造可视化游戏数据配置工作流
Unity与Excel深度整合:构建高效游戏数据配置系统 在中小型游戏开发团队中,策划与程序之间的数据流转往往是效率瓶颈所在。策划需要频繁调整数值平衡,而程序员则疲于应对无尽的配置表更新请求。这套基于UnityExcel的工作流解决方案,…...
