单向散列函数(go语言实践)

Python09

单向散列函数(go语言实践),第1张

单向散列函数(one-wayfunction)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值 (hashvalue)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。

这里的消息不一定是人类能够读懂的文字,也可以是图像文件或者声音文件。单向散列函数不需要知道消息实

际代表的含义。无论任何消息,单向散列函数都会将它作为单纯的比特序列来处理,即根据比特序列计算出散

列值。

散列值的长度和消息的长度无关。无论消息是1比特,还是100MB,甚至是IOOGB,单向散列函数都会计算出固 定长度的散列值。以SHA-I单向散列函数为例,它所计算出的散列值的长度永远是160比特(20字节)。

单向散列函数的相关术语有很多变体,不同参考资料中所使用的术语也不同,下面我们就介绍其中的儿个。 单向散列函数也称为 消息摘要函数(message digest function) 哈希函数 或者 杂凑函数 。 输入单向散列函数的消息也称为 原像 (pre-image)

单向散列函数输出的散列值也称为 消息摘要 (message digest)或者 指纹 (fingerprint)。 完整性 也称为一致性。

MD4是由Rivest于1990年设计的单向散列函数,能够产生128比特的散列值(RFC1186,修订版RFC1320)。不 过,随着Dobbertin提出寻找MD4散列碰撞的方法,因此现在它已经不安全了。

MD5是由Rwest于1991年设计的单项散列函数,能够产生128比特的散列值(RFC1321)。

MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已

经不安全了。

MD4和MD5中的MD是消息摘要(Message Digest)的缩写。

SHA-1是由NIST(NationalInstituteOfStandardsandTechnology,美国国家标准技术研究所)设计的一种能够产生 160比特的散列值的单向散列函数。1993年被作为美国联邦信息处理标准规格(FIPS PUB 180)发布的是 SHA,1995年发布的修订版FIPS PUB 180-1称为SHA-1。

SHA-1的消息长度存在上限,但这个值接近于2^64比特,是个非常巨大的数值,因此在实际应用中没有问题。

SHA-256、SHA-384和SHA-512都是由NIST设计的单向散列函数,它们的散列值长度分别为256比特、384比特和

512比特。这些单向散列函数合起来统称SHA-2,它们的消息长度也存在上限(SHA-256的上限接近于 2^64 比特,

SHA-384 和 SHA-512的上限接近于 2^128 比特)。这些单向散列函数是于2002年和 SHA-1 一起作为 FIPS PUB 180-2 发布的 SHA-1 的强抗碰撞性已于2005年被攻破, 也就是说,现在已经能够产生具备相同散列值的两条不同的消 息。不过,SHA-2还尚未被攻破。

1.安装git

因为golang是通过git来管理远程包的,所以我们首先要安装git

git安装比较简单,直接下一步即可(在Windows Explorer integration选项中将“Git Bash here”和“Git GUI here”打对勾),需要了解具体安装的可以看这里。

2.安装Golang

1) 首先到https://golang.org/dl/选择适合你系统的安装包

2)我这里选择的是:go1.4.2.windows-amd64.msi,下载完成安装到指定目录即可。我这里是(E:\Go)。

3)安装完成后环境变量已经自动设置好了,可以呼出cmd命令行输入命令查看

>go env

可以看到,已经出现go命令了。如果你的不能出现,那可能是环境变量设置的问题。

进入我的电脑->高级设置->环境变量查看下,GOROOT变量是否存在,以及Path变量中是否也设置了GOROOT。没有的话,新增一个GOROOT变量,路径则输入你刚刚安装完成后Go的根目录,如我的是:E:\Go\。然后编辑Path变量,在最后面新增"%GOROOT%bin"。

4)go命令依赖一个环境变量:GOPATH,这不是Go的安装目录,而是你的工作(工程)目录(你的代码都会在该目录下)。GOPATH可以有多个,windows以分号()进行区分,Linux系统是冒号(:),当有多个GOPATH时,默认会将go get的内容放在第一个目录下。这里我们新建一个GOPATH变量,以我的为例:F:\mygo。

3.安装Sublime Text3

注意:sublime是收费软件,不注册也可以正常使用,只是保存次数达到一定的数量的时候会提示购买忽略后可以正常使用。

这里需要安装一个sublime的pakcage control功能,用于接下来安装sublime插件。

1)在打开软件后,按下快捷键 Ctrl+`,(`这个符号为英文半角模式下,按下 Tab 键上方、数字键1左边的那个按键),此时会打开一个命令窗口,复制并输入以下内容,最后回车:

import urllib.request,os,hashlibh = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'pf = 'Package Control.sublime-package'ipp = sublime.installed_packages_path()urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) )by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read()dh = hashlib.sha256(by).hexdigest()print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

2)重启sublime之后,你就可以发现在 Preferences 这个菜单下出现了菜单项 Package Control,如图:

4. 安装GoSublime插件

1)在sublime中,按住快捷键 shift + ctrl + p,在弹出框中输入install package,如图:

2)回车,会出现如下图(可能需要稍微等待下,可以看sublime最下面的状态):

3)输入gosublime,回车(可能需要稍微等待下,可以看sublime最下面的状态),如图:

4)gosublime安装完成后,Preferences ->package settings ->GoSublime ->Settings - Uesrs需要配置下GOPATH,GOROOT,如图:

5)在打开的窗口中输入以下内容,路径请自行替换,ctrl+s保存。

{

"env": {

"GOPATH": "F:/mygo",

"GOROOT": "E:/Go"

}

}

6)重启sublime,在GOPATH中的src新建一个hello.go文件,可以看到代码自动补全已经出来了,:)

至此,sublime text3 + golang 安装完成。

Docker私有仓库Registry的搭建验证

1. 关于Registry

官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但是,有时候,我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像。这个可以通过开源软件Registry来达成目的。

Registry在github上有两份代码:老代码库和新代码库。老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发。从2.0版本开始就到在新代码库进行开发,新代码库是采用go语言编写,修改了镜像id的生成算法、registry上镜像的保存结构,大大优化了pull和push镜像的效率。

官方在Docker hub上提供了registry的镜像(详情),我们可以直接使用该registry镜像来构建一个容器,搭建我们自己的私有仓库服务。Tag为latest的registry镜像是0.9.1版本的,我们直接采用2.1.1版本。

2. Registry的部署

运行下面命令获取registry镜像,

$ sudo docker pull registry:2.1.1

然后启动一个容器,

$ sudo docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1

Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。

运行docker ps看一下容器情况,

lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker ps

CONTAINER IDIMAGE COMMAND CREATED STATUS PORTSNAMES

f3766397a458registry:2.1.1 "/bin/registry /etc/d" 46 seconds ago Up 45 seconds 0.0.0.0:5000->5000/tcp registry

说明我们已经启动了registry服务,打开浏览器输入http://127.0.0.1:5000/v2,出现下面情况说明registry运行正常,

3. 验证

现在我们通过将镜像push到registry来验证一下。

我的机器上有个hello-world的镜像,我们要通过docker tag将该镜像标志为要推送到私有仓库,

$ sudo docker tag hello-world 127.0.0.1:5000/hello-world

然后查看以下本地的镜像,

lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker images

REPOSITORY TAG IMAGE IDCREATED VIRTUAL SIZE

registry 2.1.1 b91f745cd2335 days ago 220.1 MB

ubuntu 14.04 a5a467fddcb86 days ago 187.9 MB

hello-world latest 975b84d108f12 weeks ago 960 B

127.0.0.1:5000/hello-world latest 975b84d108f12 weeks ago 960 B

接下来,我们运行docker push将hello-world镜像push到我们的私有仓库中,

lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker push 127.0.0.1:5000/hello-world

The push refers to a repository [127.0.0.1:5000/hello-world] (len: 1)

975b84d108f1: Image successfully pushed

3f12c794407e: Image successfully pushed

latest: digest: sha256:1c7adb1ac65df0bebb40cd4a84533f787148b102684b74cb27a1982967008e4b size: 2744

现在我们可以查看我们本地/opt/registry目录下已经有了刚推送上来的hello-world。我们也在浏览器中输入http://127.0.0.1:5000/v2/_catalog,如下图所示,

现在我们可以先将我们本地的127.0.0.1:5000/hello-world和hello-world先删除掉,

$ sudo docker rmi hello-world

$ sudo docker rmi 127.0.0.1:5000/hello-world

然后使用docker pull从我们的私有仓库中获取hello-world镜像,

lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker pull 127.0.0.1:5000/hello-world

Using default tag: latest

latest: Pulling from hello-world

b901d36b6f2f: Pull complete

0a6ba66e537a: Pull complete

Digest: sha256:1c7adb1ac65df0bebb40cd4a84533f787148b102684b74cb27a1982967008e4b

Status: Downloaded newer image for 127.0.0.1:5000/hello-world:latest

lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker images

REPOSITORY TAG IMAGE IDCREATED VIRTUAL SIZE

registry 2.1.1 b91f745cd2335 days ago 220.1 MB

ubuntu 14.04 a5a467fddcb86 days ago 187.9 MB

127.0.0.1:5000/hello-world latest 0a6ba66e537a2 weeks ago 960 B

4. 可能问题

可能会出现无法push镜像到私有仓库的问题。这是因为我们启动的registry服务不是安全可信赖的。这是我们需要修改docker的配置文件/etc/default/docker,添加下面的内容,

DOCKER_OPTS="--insecure-registry xxx.xxx.xxx.xxx:5000"

然后重启docker后台进程,

$ sudo service docker restart

这是再push即可。