base64编码
编码不是真正的密码学,但它在围绕加密功能的各种标准中被大量使用。尤其是 Base64 编码。
Base64 编码是一种用于将各种字节转换为特定字节范围的技术。此特定范围是 ASCII 可读字节。 这样,您可以更轻松地传输二进制数据,例如密钥或私钥。您甚至可以将它们打印出来或写下来。 编码也是可逆的。因此,如果您有编码版本,则可以创建原始版本。
在维基百科上,您可以找到更多详细信息。基本上,它会遍历所有字节,并将每组 6 位转换为可读字节(8 位)。结果是编码字节的大小增加了约 33%。
Hello ==> SGVsbG8=
0x4d 0x61 ==> TWE=
基本身份验证
Web 应用程序有时会使用基本身份验证。这使用 base64 编码。因此,至少使用传输层安全性(TLS 或更常见的 https)来保护其他人读取发送到服务器的用户名密码非常重要。
$echo -n “myuser:mypassword” | base64
bXl1c2VyOm15cGFzc3dvcmQ=
HTTP 标头将如下所示:
Authorization: Basic bXl1c2VyOm15cGFzc3dvcmQ=
如果截获了Authorization,就能破解出用户名和密码。
0x02
直接对 eWFuZ3lhbGk6cGFzc3cwcmQ=进行base64解码即可得到结果
在线编码解码:https://www.sojson.com/base64.html
其他编码
URL 编码
在向服务器发送表单数据和请求参数时,会大量使用URL编码。由于 URL 中不允许有空格,因此将其替换为 %20。对其他角色进行了类似的替换。
HTML 编码
HTML 编码可确保文本在浏览器中按原样显示,而不是被浏览器解释为 HTML。
UUEncode
Unix-2-Unix 编码已用于发送电子邮件附件。
XOR 编码
有时,编码被用作存储密码的第一种简单混淆技术。例如,IBM WebSphere Application Server 使用特定的 XOR 编码实现将密码存储在配置文件中。IBM 建议保护对这些文件的访问,并将缺省的 XOR 编码替换为您自己的定制加密。但是,如果不遵循这些建议,这些默认值可能会成为漏洞。
普通散列
哈希是一种密码学,主要用于检测原始数据是否已更改。哈希是从原始数据生成的。它基于不可逆的加密技术。 如果原始数据更改一个字节,则生成的哈希值也会有所不同。
所以在某种程度上,它看起来像是一种安全的技术。但是,在将其用于密码时,它不是,甚至从来都不是一个好的解决方案。这里的问题是,您可以从字典中生成密码,并从这些密码中计算出各种变体。对于每个密码,您可以计算一个哈希值。这些都可以存储在大型数据库中。因此,每当您找到可能是密码的哈希值时,您只需在数据库中查找哈希值并找出密码即可。
不应再使用某些哈希算法:MD5、SHA-1 对于这些哈希值,可以更改有效负载,使其仍会产生相同的哈希值。这需要大量的计算能力,但仍然是一个可行的选择。
加盐哈希
显然,普通密码不应存储在数据库中。普通哈希也是如此。 OWASP密码存储备忘单解释了当需要安全存储密码相关信息时应使用的内容。
https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
0x04
https://www.cmd5.com/
直接使用cmd5网站对两个字符串进行解密即可得到。
对称加密
对称加密基于用于加密和解密的共享密钥。因此,双方(参与交换机密)共享相同的密钥。
示例协议包括:
AES
3DES
非对称加密
非对称加密基于由密钥对组成的数学原理。这两个密钥通常称为私钥和公钥。私钥需要得到很好的保护,并且只有一方知道。所有其他人都可以自由使用公钥。使用私钥加密的东西可以被所有拥有公钥的人解密,而用公钥加密的东西只能用私钥解密。
示例协议包括:
RSA
DSA
HTTPS 同时使用对称密钥和非对称密钥
以下是打开浏览器并转到 https 站点时会发生什么的简短描述。
您的浏览器连接到服务器并获取 Web 服务器证书
浏览器通过检查证书颁发者证书是否在其信任存储中来检查它是否信任证书颁发者。此信任存储由操作系统和浏览器更新管理。在某些公司网络上,它由公司管理。浏览器从证书中获取公钥。
浏览器现在生成随机字节,用于生成对称密钥,并使用服务器的公钥对其进行加密。所以只有服务器才能解密它。
在此过程结束时,浏览器和 Web 服务器都将使用交换的对称密钥(在非对称密钥交换过程中)来加密和解密在浏览器和 Web 服务器之间来回发送的消息。
之所以使用对称密钥,是因为它可以更轻松地用于大型数据集,并且这样做需要较少的处理能力
签名
签名是一种哈希值,可用于检查某些数据的有效性。签名可以与其验证的数据分开提供,或者在CMS或SOAP的情况下可以包含在同一个文件中。(其中该文件的部分包含数据,部分包含签名)。
当完整性很重要时,使用签名。它旨在保证从甲方发送到乙方的数据不会被更改。因此,甲方通过计算数据的哈希值并使用非对称私钥加密该哈希值来对数据进行签名。然后,乙方可以通过计算数据的哈希值并解密签名来验证数据,以比较两个哈希值是否相同。
RAW签名
甲方通常按如下方式计算原始签名:
创建数据的哈希值(例如 SHA-256 哈希值)
使用非对称私钥(例如 RSA 2048 位密钥)加密哈希值
(可选)使用 base64 编码对二进制加密哈希进行编码
乙方也必须获得带有公钥的证书。这之前可能已经交换过了。因此,至少涉及 3 个文件:数据、签名和证书。
CMS 签名
CMS 签名是一种标准化方式,用于将数据 + 签名 + 证书(公钥全部在一个文件中)从甲方发送到乙方。只要证书有效且未被吊销,乙方就可以使用提供的公钥来验证签名。
SOAP 签名
SOAP 签名还包含数据和签名以及(可选)证书。多合一 XML 有效负载。计算数据的哈希值涉及一些特殊步骤。这与从系统发送到系统的 SOAP XML 可能会引入额外的元素或时间戳有关。 此外,SOAP签名提供了由不同方对消息的不同部分进行签名的可能性。
电子邮件签名
发送电子邮件不是很困难。您必须填写一些数据并将其发送到转发它的服务器,最终它将到达目的地。但是,可以使用不是您自己的电子邮件地址的 FROM 字段发送电子邮件。为了向您的收件人保证您确实发送了这封电子邮件,您可以在您的电子邮件上签名。受信任的第三方将检查您的身份并颁发电子邮件签名证书。在电子邮件应用程序中安装私钥,并将其配置为对发送的电子邮件进行签名。该证书是在特定电子邮件地址上颁发的,收到此电子邮件的所有其他用户都将看到发件人已通过验证的指示,因为他们的工具将使用受信任的第三方颁发的公共证书来验证签名。
PDF 或 Word 或其他签名
Adobe PDF 文档和 Microsoft Word 文档也是支持签名的示例。签名也与数据位于同一文档中,因此对数据的一部分和元数据的一部分有一些描述。 政府通常会发送带有包含证书的 PDF 的官方文件。
0x06
将给的私钥保存为test.ky上传linux
通过私钥生成公钥文件:
执行 openssl rsa -in test.key -pubout>test.pub 生成一个test.pub文件
提取公钥中的modulus信息:
执行 openssl rsa -in test.pub -pubin -modulus -noout 输出module
使用私钥对该modulus信息进行签名计算,并将结果进行base64编码,得到一个私钥签名的签名值的base64编码结果:
执行 echo -n “CCE0C84A178CE94395E7D63FB1D87DA56D94805E054A118B9AE206A7EEAB7E2B43B9AF80D16B68784733F9414D96DC69D5C8B481A994814B59CBF60B32845B2F65CB924CE45018D458AB0E1F46A9A716C00863057E9F60A893489240A711B42DFBDA9E95EBE80D8E2E2DA4B58B5694F0A36A059E4693F835B77F025488436095F0531B39B8EE06A16747E49AFBB959F035B4FA44F935D5DCC362425531575F7525E58A75B74DF84BB51BC574ECFA8FE9ACE36353A862195F5F5F0255E0C94E9EAC23ECC41BDC756F30B5FB5D426F9276EE6505D35971BBF6D94C21C7B4B71EF6FA5806B57B85FA140D15CB0F1CEA8BE561A33062B17B12455498D566DE245D2F” |openssl dgst -sign test.key -sha256 |base64
输出签名XzYrcngmdmtPtKDrkWfNO8gvNvhYbNI0gNYkmO+Uuas/89H5tNiciJSJGuJMf1hiix4bHsC8h8Jp
dO1nrT/yFeuootNxNS0Jg3mLpeUcQvMVDzFfQgzmqtJpHGB8OTkqFjU6XTemZEiwzvcy9ay1Orsp
lhLteSfOBbpTJ4BNfri2y9f5pAun5LD0Tyv4DRi4C9tZP9QTTq8ifo867ereVsTXUOQGBcXL/F7l
cpV0xwg8y8VE5iT1WZtaeelp8ZUU0LLIIla+Q1JG3qEkb4OQT2rzzN+8LwVyXg7Dv9qobeyv95uv
E+UrlMgE488ezdlnnknlf0fJBf9PKnjX1VFDQw==
然后将module和签名输入提交
通常情况下,签名的算法可能是公开的,但是签名用的秘钥是私密的,如果签名用的共享秘钥、私钥等信息泄露,就会导致签名值被破解,从而伪造合法的签名进行接口调用。
秘钥是我们在应用系统开发中经常会用到的东西,比如数据库的连接密码、签名用的秘钥、https对应的私钥等等。
那么如果这些秘钥在保存时,没有做足够的安全措施,那么就容易造成安全风险,一般来说,我们不建议将密码明文硬编码在代码或者系统的配置文件中,一旦主机被控制,攻击者可以通过翻阅配置文件等获取到这些密码,从而进一步访问数据库等更多的系统。
比较安全的做法是,讲代码和秘钥进行隔离,秘钥统一保存在加密机等系统中,
参考:https://zhuanlan.zhihu.com/p/652570763
0x08
需要新的docker容器,进入容器,找到root文件夹下的文件,查看内容。
[root@localhost]# docker exec -it --user root 853af53eeba9 /bin/bash
root@853af53eeba9:/# cd root
root@853af53eeba9:~# ls
default_secret
root@853af53eeba9:~# cat default_secret
ThisIsMySecretPassw0rdF0rY0u
把密码复制出来,放到secret.key这个文件
echo "ThisIsMySecretPassw0rdF0rY0u" >> secret.key
使用题目给的openssl命令结合这个secret.key文件进行解密
执行的openssl命令需要在docker内执行,否则报错。
可以得到解密后的明文字符串是“Leaving passwords in docker images is not so secure”
未加密的消息就是 Leaving passwords in docker images is not so secure
存储密码的文件是 default_secret