当前位置: 首页 > news >正文

一文搞懂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_xKxxxx的秘密密钥
Kx,yK_{x,y}Kx,yxxxyyy的会话密钥
{m}Kx\{m\}K_x{m}Kxxxx的秘密密钥加密的mmm
Tx,yT_{x,y}Tx,y使用yyyxxx的票据
Ax,yA_{x,y}Ax,yxxxyyy的鉴别码

以吃饭为例,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服务起着可信仲裁者的作用,可提供安全的网络鉴别&#xff…...

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是宏&#xff0c;而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression&#xff0c; 如果其值为假&#xff08;即为0&#xff09;&#xff0c;那么它会打印出来assert的内容…...

Docker圣经:大白话说Docker底层原理,6W字实现Docker自由

说在前面&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群&#xff08;50&#xff09;中&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer&#xff0c;并且是非常优质的offer&#…...

Redis+Caffeine多级(二级)缓存,让访问速度纵享丝滑

目录多级缓存的引入多级缓存的优势CaffeineRedis实现多级缓存V1.0版本V2.0版本V3.0版本多级缓存的引入 在高性能的服务架构设计中&#xff0c;缓存是一个不可或缺的环节。在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0…...

C#和.net框架之第一弹

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录C# 简介一、微软平台的编程二、使用VS创建第一个c#程序1、第一步2、第二步3、第三步4、第四步5、第五步C# 简介 C# 是一个现代的、通用的、面向对象的编程语言&…...

C++---背包模型---潜水员(每日一道算法2023.3.12)

注意事项&#xff1a; 本题是"动态规划—01背包"和"背包模型—二维费用的背包问题"的扩展题&#xff0c;优化思路不多赘述&#xff0c;dp思路会稍有不同&#xff0c;下面详细讲解。 题目&#xff1a; 潜水员为了潜水要使用特殊的装备。 他有一个带2种气体…...

C++类的成员变量和成员函数详解

类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类…...

(枚举)(模拟)(位运算)116. 飞行员兄弟

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 116. 飞行员兄弟 - AcWing题库 我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦…...

详解Array.prototype.shift.call(arguments)

经常看到如下代码&#xff1a; function foo() {let k Array.prototype.shift.call(arguments);console.log(k) } foo(11,22) //11 Array.prototype.shift.call(arguments)的作用是&#xff1a; 取 arguments 中的第一个参数 一、为啥要这么写&#xff0c;不直接使用argume…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...