算法,  计算机,  面试

The Principle and Application of Encryption and Encode

概念

哈希

特点

1、根据任意长度的消息计算出固定长度的散列值;

2、能够快速计算出散列值;

3、消息不同(也就是输入不同)得到的散列值也不同;

4、具备单向性。单向性的意思是无法通过散列值推算出消息。

小知识:为什么Bitcoin中的hash要算两次?

(Salt)

(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

彩虹表

彩虹表是一个用于加密散列函数逆运算的预先计算好的,常用于破解加密过的密码散列。 彩虹表常常用于破解长度固定且包含的字符范围固定的密码(如信用卡、数字等)。这是以空间换时间的典型实践,比暴力破解(Brute-force attack)使用的时间更少,空间更多;但与储存密码空间中的每一个密码及其对应的哈希值(Hash)实现的查找表相比,其花费的时间更多,空间更少。使用加盐密钥派生函数可以使这种攻击难以实现。

哈希

sha256

应用场景:

数据校验:下载的时候MD5用于校验下载的完整性。

唯一标识:白名单验证邮箱的时候出于policy的要求,传输的是hash之后的值。

hash碰撞率计算 泰勒公式

P2PKH

Pay-to-PubKey-Hash is the basic form of making a transaction and is the most common form of transaction on the Bitcoin network. Transactions that pay to a Bitcoin address contain P2PKH scripts that are resolved by sending the public key and a digital signature created by the corresponding private key.

ScriptPubKey= OP_DUP OP_HASH160 <Public KeyHash> OP_EQUAL OP_CHECKSIG
ScriptSig= <Signature> <Public Key>

Checking process:
我的理解:对签名和公钥依次执行这个操作:DUP公钥 hash160 结果与公钥hash比较 然后比较栈顶

编码

base64

一种编码方式,将二进制数据在 radix-64 后用 ASCII 字符串的格式表示出来。无难点

MD5

签名。输入不定长度信息,输出固定长度128-bits的演算法。不可逆。

非对称加密

公钥负责加密,私钥负责解密私钥负责签名,公钥负责验证

签名

数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。也是非对称加密算法和消息摘要算法的结合体。

数字摘要

CA证书颁布机构

加密

PBKDF2

密钥扩展。一种加密算法,将加salt的数据计算hash,如此遍历成千上万次提高破解难度,生成的derived key可以用于后续的操作。

PBKDF2 applies a pseudorandom function, such as hash-based message authentication code (HMAC), to the input password or passphrase along with a salt value and repeats the process many times to produce a derived key, which can then be used as a cryptographic key in subsequent operations. The added computational work makes password cracking much more difficult, and is known as key stretching.

ECC 椭圆曲线加密

椭圆曲线就是一组被 y2=x3+ax+b 定义的点集。其性质是取一条直线上的三点(这条直线和椭圆曲线相交),他们的总和等于0。这三点可以定义一个群,点为私钥,相加得到公钥,而公钥不能推算出私钥。

ECDSA

Elliptic Curve Digital Signature Algorithm 参考 椭圆曲线签名方法

两个优点
1.在已知公钥的情况下,无法推导出该公钥对应的私钥。
2.可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

ECDSA算法通过随机椭圆曲线方程的性质产生密钥,如Secp256k1。可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

ECDSA不会对数据进行加密、或阻止别人看到或访问你的数据,它可以防止的是确保数据没有被篡改

Secp256k1

secp256k1 refers to the parameters of the elliptic curve used in Bitcoin’s public-key cryptography, and is defined in Standards for Efficient Cryptography (SEC) (Certicom Research, http://www.secg.org/sec2-v2.pdf). Currently Bitcoin uses secp256k1 with the ECDSA algorithm, though the same curve with the same public/private keys can be used in some other algorithms such as Schnorr.

RSA 非对称加密

RSA属于公钥加密算法中的一个重要应用。RSA加密算法由五个部分组成:

  • 原文(Message):需要加密的信息,可以是数字、文字、视频、音频等,用 M 表示。
  • 密文(Ciphertext):加密后得到的信息,用 C 表示。
  • 公钥(Public Key)和私钥(Private Key),用 PU 和 PR 表示。
  • 加密算法(Encryption):若 E(x) 为加密算法,加密过程可以理解为 C=E(M)根据原文和加密算法得到密文。
  • 解密算法(Decryption):若 D(x) 为解密算法,解密过程可以理解为 M=D(C) 根据密文和解密算法得到原文。

假设Alice和Bob要在网上进行加密通信,他们要怎么应用RSA来加密和解密信息呢?步骤如下:

  1. 随机选择两个不相同的素数 p,q 。
  2. 将 p,q 相乘,记为 n=p×q 。
  3. 计算 n 的欧拉函数φ(n) ,欧拉函数证明,当 p,q 为不相同的素数时, φ(n)=(p−1)(q−1) 。
  4. 随机选择一个整数 e ,满足两个条件: φ(n) 与 e 互质,且 1<e<φ(n) 。
  5. 计算 e 对于 φ(n) 的模反元素 d ,也就是说找到一个 d 满足 ed=1 mod φ(n) 。这个式子等价于 ed−1=kφ(n) ,实际上就是对于方程 ed−kφ(n)=1 求 (d,k) 的整数解。这个方程可以用扩展欧几里得算法求解。
  6. 最终把 (e,n) 封装成公钥, (d,n) 封装成私钥。

SSL数字证书、代码签名证书、文档签名以及邮件签名大多都采用RSA算法进行加密。

AES加密

Advanced Encryption Standard,高级加密标准

看起来就是经过很多轮的计算和替换

HMAC 2

In cryptography, an HMAC (sometimes expanded as either keyed-hash message authentication code or hash-based message authentication code) is a specific type of message authentication code (MAC) involving a cryptographic hash function and a secret cryptographic key. As with any MAC, it may be used to simultaneously verify both the data integrity and authenticity of a message.

通过一个标准算法,在计算哈希的过程中,把key混入计算过程中,用于验证一段数据是否有效。如SHA-512。

SHA512

一种利用hash的加密算法

DSA

Digital Signature Algorithm,DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,所以它比RSA要快很多,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。

a. 发送方使用SHA-1和SHA-2编码将发送内容加密产生的数字摘要;
b. 发送方用自己的专用密钥对摘要进行再次加密得到数字签名;
c. 发送方将原文和加密后的摘要传给接收方;
d. 接收方使用发送方提供的密钥对进行解密 ,同时对收到的内容用SHA-1/SHA-2编码加密产生同样的摘要;
e. 接收方再将解密后的摘要和d步骤中加密产生的摘要进行比对,如果两者一至,则说明传输过程的信息没有被破坏和篡改,否则传输信息则不安全。

应用

HTTPS

  1. 申请CA (Certification Authority)证书,如本网站的证书
  1. 客户端解析证书并对其进行验证,从服务器证书中取出服务器的公钥A。
  2. 客户端会生成一个对称密钥,用公钥A加密后发送给服务器
  3. 服务器在收到随机码 KEY 之后会使用私钥B将其解密。
  4. 服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据。
  5. 双方使用对称加密传输所有数据。

CAS单点登录

单点登录就是多个系统,一次登录。比如baidu.com。只要你登录了baidu.com,百科、知道、经验、贴吧都会自动登录。

HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是就有了Cookie,cookie存在本地。Session存在服务器,依据Cookie来识别是否是同一个用户。单系统登录功能主要是用Session保存用户信息来实现的。而多系统的session是不共享的。

于是就有了SSO登录系统。其他子系统登录时,请求SSO(登录系统)进行登录,将返回的token写到Cookie中,下次访问时则把Cookie带上。

  • SSO系统生成一个token,并将用户信息存到Redis中,设置过期时间
  • 其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中
  • 每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录

首先,用户想要访问系统A受限的资源(比如说购物车功能,购物车功能需要登录后才能访问),系统A发现用户并没有登录,于是重定向到sso认证中心,并将自己的地址作为参数

SSO认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话(生成一份Token,写到Cookie中,保存在浏览器上)

随后,认证中心重定向回系统A,并把Token携带过去给系统A

接着,系统A去sso认证中心验证这个Token是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。

其实SSO认证中心就类似一个中转站

中间人攻击 & Charles抓包工具

攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。

Charles是我们常用的抓包工具。在手机/电脑上装上Charles的证书即可。其原理就是在客户端和服务器之间充当代理服务器,可以过滤、转发请求。

中间人攻击过程

  1. 客户端发送请求到服务端,请求被中间人截获。
  2. 服务器向客户端发送公钥。
  3. 中间人截获公钥,保留在自己手上。然后自己生成一个【伪 造的】公钥,发给客户端。
  4. 客户端收到伪造的公钥后,生成加密hash值发给服务器。
  5. 中间人获得加密hash值,用自己的私钥解密获得真秘钥。同时生成假的加密hash值,发给服务器。
  6. 服务器用私钥解密获得假密钥。然后加密数据传输给客户端。

OAuth2

OAuth(Open Authorization,开放授权)是一个开放标准的授权协议,允许用户授权第三方应用访问他们存储在资源服务上受保护的信息,而不需要将用户名和密码提供给第三方应用。

步骤

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

token

令牌(token)与密码(password)的作用是一样的,都可以进入系统,但是有几点差异。

(1)令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。

(2)令牌可以被资源持有者撤销,会立即失效。以上例而言,我可以随时取消朋友的令牌,密码一般不允许被他人撤销。

(3)令牌有权限范围(scope),比如使用令牌只允许进入客厅,不允许进入卧室。对于网络服务来说,只读令牌比读写令牌更安全,而密码一般是完整权限。

OAuth四种授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0 规定了四种获得令牌的流程,可以选择实际情况选择最适合的一种,向第三方应用颁发令牌。

  • 授权码模式(authorization-code):正宗方式,支持refresh_token
  • 简化模式(implicit): 为web浏览器应用设计,不支持refresh_token
  • 密码模式(password): 为遗留系统设计,支持refresh_token
  • 客户端模式(client credentials)为后台api服务设计,不支持refresh_token

不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID 用来标识第三方应用)和客户端密钥(client secret 用来进行安全加密)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。

MS OAuth 2.0 流程

  1. 弹出浏览器窗口,请求authorization code
  2. 用户授权,返回authorization code
  3. 用authorization code和client_id等请求OAuth bearer token
  4. 返回access_token和refresh_token
  5. 用access_token去call WebAPI

阿里云文档

参考2

MS文档

加密货币

创建账户

助记词如何保证没有重复?address的本质是一个64个字符的16进制串,通过助记词经过一系列计算映射到一个address,重复和直接穷举私钥hash没什么区别,概率是2256 分之一,是不可能猜中的。

createWallet的流程
CreateKeyring 
    GenerateMnemonic : use bip39.c worldlist.c random.c bcrypt.h generate mnemonic
        GenerateRandom(entropy, entropy_size);
            mnemonic_from_bytes : use random number to generate mnemonic
    CreateKeyringInternal
        MnemonicToSeed 64
            DeriveKeyPbkdf2HmacSha512 : mnemonic as password, with salt and iterations to get derived_key
            Pbkdf2Core->BCryptDeriveKeyPBKDF2
    ConstructRootHDKey : with seed and kEthRootPath
            HDKey::GenerateFromSeed : use seed generate private_key_ and 
                HmacSha512 HmacCore
                将hash出来的值,一半用于private_key_,一半用于chain_code_
                GeneratePublicKey 
                    secp256k1_ec_pubkey_create secp256k1_ec_pubkey_serialize
            DeriveChildFromPath
                继续生成一个HDKey
GetAccountName
AddAccountForKeyring
    addAccounts
        DeriveChild bit operation generate child_key
        add child_key to accounts_
    getAccountPath like m/44'/{coin}
    getPublicKeyAndAddress
        GetUncompressedPublicKey secp256k1
        address FromPublicKey

如何恢复/导出账户?如何上链?

TPM

TPM文档

enclave

字面意思,飞地,一个国家内别的国家的领土。

我们做的事情,就是用c语言写一个dll,然后在其他进程中调用起来。

开发这个进程的过程,就是创建一个虚拟机,在虚拟机里为这个dll赋予权限,用exe文件去调用这个dll里的方法。

参考文档

MPC

安全多方计算/安全多签技术(Secure Multi-Party Computation)主要是针对在无可信第三方的情况下,如何安全地计算一个约定函数的问题。安全多方计算是电子投票、门限签名以及网上拍卖等诸多应用得以实践、落地的密码学基础。安全多方计算通常缩写为 SMPC 或者 MPC。

核心:既保留用户体验,又避免在线、离线或在物理设备中存储整个私钥(单点妥协)。

KEK

kek是KeyEncryptionKey的缩写。这个需求是把用户的助记词加密存储到MS的云端备份,支持增删查改。由于涉及到用户的助记词,所以加密程度很高。

  1. 助记词在edge客户端加密后传输
  2. 每次传输都需要先请求一个sharedKey。每个sharedKey只能用一次,用后销毁。
  3. 每次增删都需要用户登录两次。一次是登录微软的个人账号,另一次是登录Dropbox的账号。Dropbox是具体的、存文件的地方。
  4. MFA还需要OAuth Token

加解密助记词和Nonce用到的算法:

sharedKey是用于Aes加密的密钥。客户端先传一个串到服务器端,服务器端再生成一个串用于AES加解密

private readonly ECCurve ecCurve = ECCurve.NamedCurves.nistP256;            
using ECDiffieHellman serverEcdh = ECDiffieHellman.Create(ecCurve);
var publicKey = serverEcdh.ExportSubjectPublicKeyInfo();

using ECDiffieHellman foreignPublic = ECDiffieHellman.Create(ecCurve);
            foreignPublic.ImportSubjectPublicKeyInfo(Convert.FromBase64String(clientPublicKeyBase64), out _);
var sharedKey = serverEcdh.DeriveKeyFromHash(foreignPublic.PublicKey, HashAlgorithmName.SHA256);

return (publicKey, sharedKey);

每次传输都需要base64编码

参考

pseudorandom function 伪随机

brute-force attacks 暴力破解

最后更新于 2023年1月4日 by qlili

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x