一文搞懂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…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
