上周,一项关于是否 进行了一次投票,获得了高票通过(37 人赞成,0 人反对)。
当 PHP 7.2 在今年年底发布时,PHP 将成为第一个在标准库中采用现代密码学模块的编程语言。
作者 写了一篇 ,详细介绍了 php7.2 成为首个在标准库中引入现代密码学模块的编程语言的方方面面。
Scott Arciszewski 采用了知识共享协议许可(Creative Commons License),经作者授权,InfoQ 翻译本文如下。
现代密码学库往往满足以下两个条件:
如果在 OpenSSL 和 Golang 中实现公钥加密和数字签名,则必须在 RSA 和 NIST ECC 之间进行选择。这两者都不是一个好选择。
坐标,则通过中国剩余定理泄漏您的密钥
- (x,y)
现代密码学需要使用安全原语。对于公钥加密,这意味着在 和 所描述的原语。对于对称加密,这意味着 。
NIST 曲线(P-256 等)不符合现代密码学原则(不过并不影响密码学库中使用这些算法)。
Libsodium 的原语包括:
但你可能不需要担心这些细节,因为它也提供了一个……
为了促进 libsodium 中的公钥加密,您只需要按照以下去进行:
- // Some example variables:
- $alice_ecdh_secret =
- "\x69\xf2\x08\x41\x2d\x8d\xd5\xdb\x9d\x0c\x6d\x18\x51\x2e\x86\xf0" .
- "\xec\x75\x66\x5a\xb8\x41\x37\x2d\x57\xb0\x42\xb2\x7e\xf8\x9d\x8c";
- $bob_ecdh_public =
- "\xe8\x98\x0c\x86\xe0\x32\xf1\xeb\x29\x75\x05\x2e\x8d\x65\xbd\xdd" .
- "\x15\xc3\xb5\x96\x41\x17\x4e\xc9\x67\x8a\x53\x78\x9d\x92\xc7\x54";
- $message_keypair = sodium_crypto_box_keypair_from_secretkey_and_publickey(
- $alice_ecdh_secret,
- $bob_ecdh_public
- );
- $plaintext = "This is a secret message for your eyes only.";
- $nonce = random_bytes(24);
- // And now for the actual public-key encryption step:
- $ciphertext = sodium_crypto_box($plaintext, $nonce, $message_keypair);
解密信息:
- $received = sodium_crypto_box_open(
- $received_ciphertext,
- $received_nonce,
- $message_keypair
- );
如果你使用 PHP 进行开发,并且当 7.2 发布时可以升级到新版本,你会享受现代加密作为语言本身的一部分带来的好处。现在可以设计使用 Ed25519 数字签名(例如用于自动安全更新)的软件,而不需要用户安装可选的 PHP 扩展。
已经出现了一堆 的信息。可是,大多数并非提议在这个问题上超越 PHP 语言。
然而,事实并非如此:
Go 1.8 将在 TLS 堆栈中使用 X25519 和 ChaCha20-Poly1305,但它在标准库中并不提供现代应用层加密。这意味着你也可以在 Go 中使用现代的 TLS 算法,但是如果你想要进行额外的数据加密操作,你需要在标准库之外引入其他第三方库。
大多数其他编程语言(Ruby、Erlang、Node.js)仍然只提供 OpenSSL,它会误导开发者继续滥用 RSA,在 下使用 AES 加密,并且永远不会验证它们的密文。此外,许多这些语言仍然使用 OpenSSL 的 ,并且不公开一个合理的 API 访问操作系统的 CSPRNG。(PHP 7.0 正在解决这个问题。)
PHP 7.2.0 版本中引入的现代密码学模块使其成为 第一个在标准库中提供了现代密码学支持的编程语言 。
如果你是一个热情的语言传道者,现在最好的事情是努力争取二次市场。看到大家放弃了 RSA 和 foot-bullety ECDSA,我很高兴。
来源: http://www.tuicool.com/articles/qER7FbN