日常开发中,了解这些可以帮助我们更好的解决业务上的问题。本文不涉及具体的实现,只需要看看了解即可。
编码
编码是可逆的,所以很少使用编码作为加密方式(主要不安全),它只是改变了数据的表现形式,常和加密配合使用。更多情况下将其作为数据传递中的一种选择。
Base64
Base64 是一种常见的编码方式,使用 64 个字符 A-Z(26)、a-z(26)、0-9(10)、+、/ 进行编码,因此称作 Base64。它主要用于将二进制数据编码为 ASCII 字符串,确保数据完整可用,以便在不同环境中传输或存储。
哈希
常规/标准 hash 和密码学 hash 有些许不同,常规 hash 常用于哈希表、校验和,生成速度快。密码学 hash 具有很强的抗碰撞性,生成速度相比而言较慢。
hash ≠ 加密,hash 具有以下特性:
- 不可逆:即单向,无法从哈希值中恢复原始数据。
- 长度固定:对于给定的输入,hash 值的长度是固定的。
- 唯一性:对于不同的输入,hash 值应该是唯一的。
- 确定性:相同的输入总是生成相同的 hash 值。
- 抗碰撞性:即使输入发生微小变化,hash 值也应该有很大差异。
hash 算法有很多:
- MD5(128 bit)
- SHA1(160 bit)
- SHA2:SHA224、SHA256、SHA384、SHA512
- SHA3:SHA3-256…
- BLAKE2b
- …
如今,MD5 已经被破解,SHA1 也已弃用,因此不建议在安全性较高的场景下使用。SHA256 广泛用于 TLS、SSL、SSH、电子邮件签名等场景。
参考:https://shautils.com/hash-algorithm-comparison
MD5
MD5的典型应用是对一段信息(Message)产生信息摘要(),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5(xxxx.tar.gz) = 0ca175b9c0f726a831d895e269332461
这就是xxxx.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件名做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt 文件中,并对这个 readme.txt 产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5 还广泛用于操作系统的登陆认证上,如 Unix、各类 BSD 系统登录密码、数字签名等诸多方。如在 UNIX 系统中用户的密码是以 MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行 MD5 Hash 运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5 将任意长度的“字节串”映射为一个 128bit 的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的 md5() 函数重新设一个密码,如 admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码 MD5 值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。
加密
加密是双向的,只要持有密钥,就可以翻译加密后的数据,也可以加密新的数据。加密的主要目的是防止未经授权的数据访问。
加密有两种基本类型:对称加密和非对称加密。在对称密钥中,同一密钥用于加密和解密数据,就像密码一样。在非对称加密中,一把密钥用于加密数据(公钥),另一把密钥用于解密数据(私钥)。
对称加密:AES、DES、3DES 非对称加密:RSA、ECC、DSA
加密后的内容一般都是二进制,不利于阅读,二进制的某些特殊位在传输中可能会丢失或被误解。因此,经常使用的方式时加密后转 16 进制或 Base64 编码后传递,这就结合了上面的优点。
参考: https://www.privacyjournal.net/aes-encryption/
编码方案
UUID
UUID(Universally Unique Identifier)也被称为 GUID(全球唯一标识符)。UUID 的总长度为 128 bit,共 16 个字节,采用十六进制表示,所以一共 36 个字符。用四个 - 将 32 个十六进制字符划分为 5 部分:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。
UUID 的主要目的是为每个对象分配一个唯一的标识符,以便在不同系统和不同时间间隔内识别对象。
UUID 的分类:
UUID1:基于时间戳和MAC地址生成的UUID UUID2:与 version 1 类似,由 DCE(Distributed Computing Environment)安全标准生成的UUID UUID3:通过哈希命名空间标识符和名称生成,使用 MD5 哈希 UUID4:使用随机数和安全的伪随机数(SecureRandom)生成器生成 UUID5:和 version3 类似,但是使用 SHA-1 哈希 UUID6、7:基于时间戳,有序,可以看作是为高负载数据库和分布式系统中的 key 设计的。 UUID8:可以自定义
UUID的特点:
唯一性:UUID的设计目标是确保每个UUID都是唯一的 不可预测性:UUID的生成算法设计为不可预测,这意味着攻击者无法预测下一个UUID的值 高性能:UUID的生成速度非常快,适合高性能应用

说些什么吧!