数字签名
目前在计算机业界应用广泛的基本上就是密码学中的非对称加密和Hash算法。
数字签名由非对称加密和数字摘要两种技术合成的,可以防伪造(机密性)和篡改(完整性)。
rsa非对称加密 + hash摘要 = 数字签名
对于摘要:私钥签名、公钥验证
对于加密:公钥加密、私钥解密
A | B | 备注 |
---|---|---|
报文->Hash算法(比如MD5,SHA256)生成摘要->私钥(A的)签名 | 使用公钥(A的)验证 | 摘要部分:A想把签名的消息发给B |
使用公钥(B的)加密 | 使用私钥(B的)解密 | 加密部分:A想把加密的消息发给B,让B知道是什么消息 |
SSH
please tell me who you are的故事
对于放在Gitlab上的代码,使用https的方式来clone,这样就省去了配置ssh的私钥和公钥的步骤。说白了,只要涉及到ssh协议的传输,那么一定会需要公钥和私钥的,所以,Gitlab相关的Git操作和连接远程服务器都要用。
Mac上terminal通过ssh连接远程Linux服务器的方法:
- 生成公、私钥
ssh-keygen -t rsa -C "xxx"
-
其中公钥、私钥放在自己本地
~/.ssh
文件夹下 -
将公钥文件内容拷贝到远程服务器的
.ssh/authorized_keys
文件里面 -
如果为了更加方便地登录,在本地
~/.ssh
文件夹下新建config文件,内容如下。就可以使用ssh xxx
直接登录。
Host xxx
HostName 远程服务器IP
User 远程连接使用的账号,如root
IdentityFile ~/.ssh/id_rsa 私钥文件所在路径
附:使用不同的非对称加密算法生成公钥、私钥
ssh-keygen -t ed25519
更加具体的内容:https://www.cnblogs.com/xz816111/p/9479139.html
零知识证明
其是一种特殊的交互式证明,其中证明者知道问题的答案,他需要向验证者证明“他知道答案”这一事实,但是要求验证者不能获得答案的任何信息。
可以参考这样一个简单的例子。证明者和验证者都拿到了一个数独的题目,证明者知道一个解法,他可以采取如下这种零知识证明方法:他找出81张纸片,每一张纸片写上1到9的一个数字,使得正好有9份写有从1到9的纸片。因为他知道答案,他可以把所有的纸片按照解法放在一个9乘9的方格内,使得满足数独的题目要求(每列、每行、每个九宫格都正好有1到9)。放好之后他把所有的纸片翻转,让没有字的一面朝上。这样验证者没办法看到纸片上的数字。接下来,验证者就验证数独的条件是否满足。比如他选一列,这时证明者就把这一列的纸片收集起来,把顺序任意打乱,然后把纸片翻过来,让验证者看到1到9的纸片都出现了。整个过程中验证者都无法得知每张纸片的位置,但是却能验证确实是1到9都出现了。