我正在尝试理解Kerberos身份验证。
到目前为止我的理解是:
假设'Alice‘(A)想和'Bob’(B)交谈。步骤1: A -> S:{A,B,None} K(A,S),其中是Kerberos,K(A,A,A)是A和S之间通信的密钥,步骤2: ->A {K(A,B),{K(A,B),A} K(B,B)} K(A,B)}K(A,B)服务器返回用于A和B之间通信的密钥,以及用密钥加密的该密钥的第二份副本,该密钥用于B和K(B,B)之间共享信息。K(B,S)不为A所知,所有这些都是用K(A,S)加密的。步骤3: {K(A,B),A} K(B,S) A向B发送他们将用K(B,S)加密的密钥,步骤4: B->A {农} K(A,B) B解密该消息,并发送一个使用K(A,B)步骤5加密的数字: A->B {Nonce+1} K(A,B)是否正确测试它们是否在同一密钥上
因此:
如果S不授权A和B之间的通信,那么它就不会认证密钥K(A,B)到B。通过加密{K(A,B) A} K(B,S),我们保证我们已经验证了这个过程。A没有K(B,S),所以不能验证它本身。如果'A‘使用了一个不同的键,比如K(B,S)’,他们就会发送:{K(A,B) A} K(B,S)‘。当B用K(B,S)破译时,由于信息是用不同的密钥加密的,它不会产生K(A,B),而是一些K(A,B)‘。因此,当B发送回{ Nonce } K(A,B)‘A时,将无法检索该Nonce并完成身份验证。
我正确理解了吗?
另外(我认为这可能是另一个问题):Kerberos是如何独立地设置K(A,S)和K(B,S)的?Kerberos如何确保“A”是他们所说的“A”呢?
发布于 2015-12-26 10:57:17
Kerberos是如何独立地设置K(A,S)和K(B,S)的?
对于用户,密钥是从帐户密码派生的(使用主体和领域名称作为salt)。当您在帐户上设置或更改密码时,KDC存储由此派生的密钥。当您使用kinit登录时,Kerberos客户端将得到与KDC相同的密钥。
对于服务,密钥在KDC上随机生成,并在"keytab“文件带外提供给服务。通常,密钥生成是通过使用管理员的用户凭据进行保护的Kadmin RPC完成的(还可以选择通过HTTPS、SFTP、USB棒等进行传递)。
Kerberos如何确保“A”是他们所说的“A”呢?
就像许多其他系统一样,它假设只有帐户所有者知道秘密密钥--因此,知道秘密密钥的人必须是帐户所有者。
还请注意,由于服务本身有K(B,S),它可以为A→B制作“假”票;有时这被认为是一项功能。
https://security.stackexchange.com/questions/84772
复制相似问题