xavierskip

xavierskip 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织 xavierskip.com 编辑
编辑

take easy and stay focus

个人动态

xavierskip 回答了问题 · 2019-11-08

ssh 登录服务器的指纹如何获取、验证,以及除了中间人攻击外什么操作会改变服务器指纹?

Checking ssh public key fingerprints

在服务端显示fingerprint,用肉眼对比。

cd /etc/ssh
for file in *sa_key.pub
do   ssh-keygen -lf $file
done

登陆显示信息

ssh -o VisualHostKey=yes example.com

https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Public_Key_Authentication#Downloading_keys

ssh-keygen -l -f file 根据钥匙生成指纹信息
ssh-keygen -l -E md5 -f file 指定 hash 的方式
ssh-keyscan example.com 获取主机公钥信息 (就是保存在本地的~/.ssh/know_hosts文件中的内容)


Retrieve the key:

  • download the key withssh-keyscan example.org > key.pub
  • or: find the keys on the server in/etc/ssh

Generate the hash:

  • make sure you have only one line/type, so either delete all others inkey.pubor runssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub(default hash, depending on OpenSSH version)
  • ssh-keygen -l -f key.pub -E md5(md5 on current OpenSSH)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64(sha256 on old OpenSSH)
  • (You might need to start the line withawk '{print $3}'for newer versions of ssh-keyscan because the format changed)

from:https://superuser.com/questions/929566/sha256-ssh-fingerprint-given-by-the-client-but-only-md5-fingerprint-known-for-se/929567#929567

关注 5 回答 4

xavierskip 赞了回答 · 2019-11-08

ssh 登录服务器的指纹如何获取、验证,以及除了中间人攻击外什么操作会改变服务器指纹?

如何通过其他方式进入服务器,验证指纹,或者提前就获取指纹信息,进行比对?

我就当你问的是两个问题。

如何提前获取指纹信息进行比对?
答:SSH客户端已经帮你做了,就是你贴出来的那些,比对不成功,默认拒绝让你继续登陆下去,防止你的密码(如果用的是密码)被伪造的服务端窃取。

如何获取服务端真实的指纹?
答:服务端的指纹默认存储在/etc/ssh/。
从你给的信息来看,你的SSH客户端采用的是ECDSA密钥,就是/etc/ssh/ssh_host_ecdsa_key.pub的内容。
但是你比对这个并没有什么用。

clipboard.png

原因很简单,中间人可以搞得到服务端的公钥,
那么他也能把这个指纹存储在默认的位置,至于私钥,一般情况下你不会去验证一下他的私钥和公钥能不能配对,所以他随便伪造一个就行了。

但是中间人没办法弄到私钥,他也就没办法解密你和服务端之间传输的数据。

这里涉及到公约加密私钥解密公钥解密私钥加密这种非对称加密措施,具体不讲。

换句话说,他搞到服务端的公钥,(即便能通过公钥)伪造了一个服务端,(虽然没有私钥也不能启动一个服务端,特殊情况另说),
但是你发给服务端的数据需要服务端的私钥解密,也就是说,他没办法解密,没用。

也就是说:

只要第一次登陆成功,并且确认你登录的机器是自己的机器,那么后续遵循ssh客户端默认的安全策略,是绝对没有任何安全问题的。
只要第一次登陆成功,并且确认你登录的机器是自己的机器,那么后续遵循ssh客户端默认的安全策略,是绝对没有任何安全问题的。
只要第一次登陆成功,并且确认你登录的机器是自己的机器,那么后续遵循ssh客户端默认的安全策略,是绝对没有任何安全问题的。

确认是自己的机器很简单,看看自己的文件是不是在就行了。

评论区有人质疑整个机器被做了proxy,那么我还能提供一个方案:

理论上第一次是绝对不安全的,但是没有绝对。
看到私钥公钥总是提密码学、然后提到密钥加密就不好了。

密钥加密本身就不安全,但是密钥本身也是一种妥协,密钥本身就是使用足够长的密钥进行加密,使得你破解成为一件很耗时间的事情(消耗数以年记的时间)。

那么妥协一下就很简单了,

很简单,即便他能劫持你cat ssh公钥的内容,能劫持vim打开,但是很难劫持你编辑这个文件,例如在文件开头加一个回车,例如在公钥中间加一个回车。

也根本不能劫持你自己写脚本

wget http://www.abidu.com/cat_key.sh
bash cat_key.sh

其中cat_key.sh的内容是 cat ssh_key.pub,或者cat_key.sh根本就是个二进制文件。

评论区又提出公钥私钥直接被proxy替换。

也很简单就能破解,安装机器必然通过安装脚本,安装脚本如何操作是个问题。

  1. bash不会实时记录操作,但是可以通过logger实时记录每一次操作。

  2. 定制系统日志,登陆后进行审计。

能黑进路由器的黑客不是很多,有直接替换的能力的,是黑产/白帽行业的顶尖,国家机器、专业黑客团队和NSA,还能偷偷抹平操作记录的,就只剩NSA了。

说这么多,还是比较麻烦,非得神经兮兮的怀疑的话,
那就只能机器提供方提供公钥或者指纹了。

一般情况下,
服务端弱口令、密码爆破才是王道。
那些黑客最喜欢用各种工具扫描弱密码了。
安装一个denyhosts并启动,
会默认屏蔽掉大部分的恶意ssh请求。

关注 5 回答 4

xavierskip 赞了回答 · 2018-12-07

解决准备更换git托管,如何迁移原git仓库

git commit -m "Change repo." # 先把所有为保存的修改打包为一个commit
git remote remove origin # 删掉原来git源
git remote add origin [YOUR NEW .GIT URL] # 将新源地址写入本地版本库配置文件
git push -u origin master # 提交所有代码

关注 11 回答 7

xavierskip 关注了标签 · 2018-01-24

http

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

关注 813

xavierskip 回答了问题 · 2018-01-03

解决[初学] Python 中嵌套函数声明global的问题

def createCounter():
    L = 0
    def counter():
        B = L +1
        return B
    return counter
c = createCounter()
print([c(),c(),c()])

你试一下这个。
数值是常量,而list这种数据结构,变量保存的是引用地址。和变量作用域以及变量的数据类型也有关。

def createCounter():
    L = 0
    def counter():
        nonlocal L
        L += 1
        return L
    return counter
c = createCounter()
print([c(),c(),c()])

不知道你为什么要这么用,可以去了解一下“闭包”、“变量作用域”等相关知识。

关注 2 回答 1

xavierskip 回答了问题 · 2017-12-28

Python3在中文Windows系统中以标准输出的方式输出UTF-8编码字符的方法?

重新定义stdout via: https://stackoverflow.com/a/3...

utf8_stdout = os.fdopen(sys.stdout.fileno(), mode='w', encoding='utf-8', closefd=False)
sys.stdout = utf8_stdout

或者设置好环境变量
set PYTHONIOENCODING=utf-8

关注 3 回答 3

xavierskip 提出了问题 · 2017-12-27

Python3在中文Windows系统中以标准输出的方式输出UTF-8编码字符的方法?

Windows系统的代码页为

C:\Users\>chcp
活动代码页: 936

Python 3.6.3

> import sys, locale
> print(sys.stdout.encoding, locale.getpreferredencoding())
utf-8 cp936

hello.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, locale

if __name__ == '__main__':
    print(sys.stdout.encoding, locale.getpreferredencoding())
    print('你好,世界')
    

执行python hello.py > hello.txt,然后打开hello.txt文件显示文件的编码为ANSI。

怎样能够让输出的文件编码为UTF-8?

关注 3 回答 3

xavierskip 回答了问题 · 2017-12-27

解决pyinstaller打包exe在别的电脑上运行 不了,出现fail to execute script

你是用什么参数打包的呢?有没有使用-w参数?如果没有,添加这个参数,然后运行看看提示什么错误。

如果你的程序使用了标准输入输出,然后设置了打包的时候设置了-w, --windowed, --noconsole就不能正确执行在Windows系统下。
http://pythonhosted.org/PyIns...

Windows and Mac OS X: do not provide a console window for standard
i/o. On Mac OS X this also triggers building an OS X .app bundle. This
option is ignored in *NIX systems.

还有3.3版本的pyinstaller打包的程序不能在Windows XP下执行。

你有没有告诉你的Python版本也没有说你安装的pyinstaller版本也没有说你打包的系统版本,更没有说别的运行不了的电脑系统版本是什么?

下面的是在使用pyinstaller时遇到的坑,不知道有没有帮助
http://blog.xavierskip.com/20...

关注 2 回答 2

xavierskip 赞了回答 · 2017-12-27

pyinstaller 打包之后,运行无法生成log文件,是为什么?

其实有生成log文件,但是不是在exe文件所在的文件夹内。
path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'log', self.loggerName)
问题在这一句代码。
os.path.dirname(__file__)返回的是当前脚本的所在路径,使用pycharm和直接点击运行py文件,这个路径均为脚本的所在路径,而生成exe之后点击运行,这个路径变为exe释放路径C:Users...AppDataLocalTemp_MEI*,所以log文件生成在这个路径下,在结束运行后,这个路径文件夹会被删除。
最后改这句代码为

if getattr(sys, 'frozen', False):
    pathname = sys._MEIPASS
else:
    pathname = os.path.split(os.path.realpath(__file__))[0]

参考http://blog.csdn.net/pipisorr...
此博文得到解决方案

关注 2 回答 1

xavierskip 关注了标签 · 2017-12-12

pyinstaller

将python脚本打包成exe等可运行程序的第三方库

关注 3

认证与成就

  • 获得 27 次点赞
  • 获得 70 枚徽章 获得 4 枚金徽章, 获得 27 枚银徽章, 获得 39 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2012-04-20
个人主页被 814 人浏览