Io 编程/附加组件和您/Blowfish
首先,Blowfish 究竟是什么?
“Blowfish 是一种对称分组密码,可以用作 DES 或 IDEA 的直接替代。它采用可变长度密钥,从 32 位到 448 位,使其非常适合国内和出口使用。Blowfish 由布鲁斯·施奈尔于 1993 年设计,作为现有加密算法的快速、免费替代方案。从那时起,它受到了相当大的分析,并且正在逐渐被接受为一种强大的加密算法。Blowfish 没有专利和免版税,并且可免费用于所有用途。” — http://www.schneier.com/blowfish.html
在撰写本文时,它是一段 17 年历史的加密代码,至今仍未被破解,尽管它有一个推荐用于更新应用程序的替代算法(Twofish),但 Blowfish 对于新旧应用程序来说仍然相当安全。
Blowfish 附加组件与 Io 源代码分发一起提供,并且没有外部依赖项,因此如果您使用 Io 解释器编译了附加组件并且您的解释器支持加载附加组件,那么它将可用。如果您在您的平台上按照 Io 的标准构建程序进行操作,或者下载了二进制包,那么您很可能可以访问 Blowfish 对象。
请注意,加密可能是一个繁琐的操作,因为它为任何数据处理管道添加了一个额外的步骤,您必须有一些方法来安全地获取和处理加密密钥,并且在某些国家/地区,处理和分发加密数据的法律后果。也就是说,有时潜在的复杂性是值得的。您应该理想地将加密用于敏感数据,例如
- 如果您在用户的机器上存储信用卡信息。
- 如果您在用户的机器上存储财务信息。
- 如果您通过网络或以其他方式以这种方式传递私人信息,以便其他用户可以访问数据,但不是那些应该阅读数据的人。
- 出于身份验证目的,例如在身份验证服务器和服务渲染服务器之间传递令牌。有关此类身份验证的示例,请阅读 Kerberos 协议。
- 根据用户的请求,因为他们输入了他们认为足够重要的数据来保护。
同样重要的是要记住,没有加密算法或做法是 100% 安全的,并且数据只能使未经授权的人员难以(但并非不可能)读取。安全研究人员和硬件进步可以使任何曾经被认为是“不可穿透”的算法在足够的时间和奉献精神下很容易被破解,并且情报机构可能已经破解了常用算法,而没有透露他们已经能够做到这一点。请注意,如果您打算将数据保密,而该用户也应该以某种方式与数据交互,那么加密就没什么用,并且如果您尝试使用这种方式来实现某种形式的数字版权管理,通常只会让最终用户感到厌烦。
要加密或解密数据,您需要创建一个 Blowfish 对象并将加密密钥设置为将要使用的序列。此序列对于解密对象和加密对象必须相同,以便解密的数据有意义,请在传输或存储数据时牢记这一点。请注意,将加密密钥存储在脚本中将从一开始就破坏使用加密进行本地存储的目的,除非您可以严格控制谁可以使用文件权限设置读取脚本内容。首先打开一个文本文件(我们将将其称为“blowfish_test.io”以供参考),并在其中输入以下文本
encryptor := Blowfish clone decryptor := Blowfish clone
然后,在终端中运行该文件
$ io blowfish_test.io
如果结果类似于以下内容
Exception: Object does not respond to 'Blowfish' --------- Object Blowfish Command Line 1
那么您没有安装 Blowfish 附加组件。如果运行该命令没有输出,那么您确实安装了该附加组件,并且该脚本运行成功。假设一切顺利,我们需要添加一个密钥才能使其有任何用处,毕竟,如果任何人都可以在没有任何努力的情况下打开消息,那么加密就没有意义,对吧?:) 现在将以下代码添加到您的脚本中
key := "secret" encryptor setKey(key) decryptor setKey(key)
这将加密和解密对象都设置为使用相同的密钥,因此解密对象将能够理解加密对象输出的数据。使用 Blowfish 附加组件加密或解密数据有两种方法:一次性或流式。本指南涵盖了这两种方法。
要一次性加密整个序列,只需将 encrypt
消息发送到一个 Blowfish 对象,其加密密钥设置为如下
encryptedText := encryptor encrypt("This is a very secret sentence.")
要一次性解密整个序列,您执行相同的操作,但消息现在称为 decrypt
decryptedText := decryptor decrypt(encryptedText)
在流模式下使用 Blowfish 对象时,您需要首先设置流是加密还是解密,您可以使用 setIsEncrypting
消息来执行此操作,该消息对于加密流为 true
,对于解密流为 false
encryptor setIsEncrypting(true) decrypting setIsEncrypting(false)
其工作原理是存在 inputBuffer
和 outputBuffer
插槽,它们是序列,您首先发送 beginProcessing
来准备流,然后使用 appendSeq
将加密或未加密的块放入 inputBuffer
中,然后定期发送 process
消息以使尽可能多的来自输入缓冲区的数据被加密并放入输出缓冲区,这可以通过给定数据完成。由于 Blowfish 在加密固定大小的块方面的工作方式,因此当您运行 process
时,任何小于预期块大小的内容都不会被加密,当您完成将所有要加密或解密的数据导入管道后,只需发送 endProcessing
。endProcessing
会使任何剩余的数据被加密或解密,并根据需要填充数据以使其正常工作,这表示流的结束。请参阅以下示例
encryptor beginProcessing encryptor inputBuffer appendSeq("Hello, I am a toaster.") encryptor process encryptor inputBuffer appendSeq(" I am another toaster.") encryptor endProcessing encryptor outputBuffer println # this should print what looks like garbage