miniLock, 文件加密软件,使用更少的

分享于 

16分钟阅读

GitHub

  繁體 雙語
File encryption software that does more with less.
  • 源代码名称:miniLock
  • 源代码网址:http://www.github.com/kaepora/miniLock
  • miniLock源代码文档
  • miniLock源代码下载
  • Git URL:
    git://www.github.com/kaepora/miniLock.git
    Git Clone代码到本地:
    git clone http://www.github.com/kaepora/miniLock
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/kaepora/miniLock
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    # miniLock
    ##File 加密软件,使用更少的。

    ###Download

    miniLock目前被审计,对等审查软件。 可以为 Google Chrome 和 Chrome 操作系统提供初始 public 版本。

    在 ###Software Cure53技术基金的支持下,状态miniLock受到了由执行的加密代码审核。 从审计报告( PDF )的结尾引用:

    Cure53的任务是测试miniLock的应用程序安全性,并评估它的加密属性和承诺。 四天的人工测试过程中,没有发现严重的错误。 编写的代码完整整齐,结构良好,最少,因这里没有接收器直接开发。

    miniLock还附带了一个位于 test的单元测试 工具包。

    ###0. 概述miniLock是一个小型的便携式文件加密软件。 behind 设计为用户记住的密码短语以及电子邮件地址,可以作为完整的。可移植的基础,它可以作为一个永久的密钥对,并为其他密钥对,如存储在磁盘媒体服务器上的密钥对。

    椭圆曲线加密的发展,特别是在 curve25519 等系统中,允许我们生成密钥对,其中 public 和 private 键的长度相对较小。 这意味着 public 键更容易共享(。miniLock public 密钥,称为 miniLock IDs,适合于不到半个tweet的inside )。 这也意味着可以使用足够的熵的人工memorizable密码作为派生 private 密钥的基础。

    首次打开时,miniLock要求用户输入他们的电子邮件地址和密码,然后使用密码表导出用户和 public 密钥的private。 通过这个模型,用户可以在任何使用miniLock安装的计算机上建立密钥对。 由于 curve25519 中的小密钥大小,我们保证了小型。易于使用的tweetable public 键和 private 密钥。 miniLock还包含检查以确保用户输入的密码短语具有足够的熵。 miniLock将完全拒绝弱密码短语,并建议使用更强的密码短语供用户使用。

    然后miniLock允许用户通过 miniLock id将文件加密给其他miniLock用户,并解密发送给他们的文件。 加密minilock格式支持将单个文件加密为可以忽略文件大小增加的多个收件人。 另一个特性是分析miniLock加密文件不会产生发件人或者 recipient(s)的miniLock of或者标识。 解密时,合法收件人将能够知道并验证发件人的身份,但仍无法确定它的他潜在收件人。

    miniLock文件加密提供保密性和完整性。 由于miniLock是以简单。可以审核和小尺寸为中心的,它使用了 TweetNaCL 加密库( ),它。 同样,miniLock被设计为尽可能简单。可以移植。可以审计和可用。 miniLock还使用 scrypt 用于"内存硬"密钥派生。

    ###1. 用户流概述了一个示例用户流,以帮助演示miniLock应该如何帮助人们。

    小红想把她的护照扫描给 Bob。 通过电子邮件发送会损害个人信息,所以Alice决定首先使用miniLock加密扫描。

    Bob打开miniLock并输入他的电子邮件地址和密码。 miniLock显示了他的miniLock ID,它与密码短语绑定在一起,并且持久化。 他向Alice发送了他的miniLock ID,它看起来像这样: quBSaJLXKsRiaSrhgkPnswKocth711H29ZamMi1H9j4Mb

    Alice拖拽她的护照扫描到miniLock中,并输入bob的miniLock作为接收者。 她单击加密按钮并将得到的.minilock 文件发送到 Bob。 一旦Bob将加密文件拖到miniLock上,它将自动检测到为Bob的miniLock加密文件,并将它的解密并保存。

    为了严格限度地限制输入密码中存在的熵,###2. 密钥派生miniLock使用了 zxcvbn的库。 miniLock不允许密码下降 below的阈值为 100位熵: 如果检测到低熵密码句,miniLock将拒绝它,并且不允许访问加密或者解密函数。

    鼓励用户使用更容易记住但难以猜测的密码短语。 如果用户无法输入足够的熵密码,miniLock将使用 58,110英语中最常用词词典建议七个词口。 这为我们提供了一个大约 111位熵的密码短语,因为 581107 ~= 2111.

    获得合适的密码后,使用 BLAKE2s 将它的散列并通过 scrypt 传递结果 32字节,以获取用户 curve25519 密钥的private。 scrypt 是使用以下参数调用的::

    • N = 217
    • R = 8,
    • p = 1,
    • L = 32

    miniLock使用用户输入的电子邮件地址作为 scrypt 键派生 salt。 电子邮件地址是唯一的,因此为salt提供了良好的基础。

    获得 32-byte private 键后,将导出 public 键,以便与 TweetNaCL curve25519-xsalsa20-poly1305 构造一起使用。

    用户的miniLock ID 由 33字节组成。 前 32个字节是用户 public 键的curve25519。 最后一个字节作为校验和: 它是通过将 BLAKE2s 设置为 1-byte 输出的第一个 32字节来导出的。 在构建 miniLock ID的33字节之后,将它的编码为Base58表示形式,这意味着通过电子邮件或者即时消息传递可以方便地。

    ###3. 文件格式miniLock以以下格式将加密文件保存为二进制 blob:

    miniLock magic bytes (8 bytes)
    Header length inbytes (4 bytes, little-endian)
    Header bytes
    Ciphertext bytes

    miniLock magic字节识别这是一个miniLock加密的file:

    0x6d, 0x69, 0x6e, 0x69,0x4c, 0x6f, 0x63, 0x6b

    标题本身是文本字符串对象,它包含收件人解密文件所需的信息。 JSON对象具有以下格式:

    {version: VersionoftheminiLockprotocolusedforthisfile(Currently1)(Number)ephemeral:PublickeyfromephemeralkeypairusedtoencryptdecryptInfoobject(Base64),decryptInfo: {
     (Onecopyofthebelowobjectforeveryrecipient)Uniquenoncefordecryptingthisobject(Base64): {
     senderID: Sender'sminiLockID(Base58),
     recipientID: miniLockIDofthisrecipient(usedforverfication)(Base58),
     fileInfo: {
     fileKey: Keyforfiledecryption(Base64),
     fileNonce: Nonceforfiledecryption(Base64),
     fileHash: BLAKE2shash(32bytes)oftheciphertextbytes.(Base64) } (fileInfoisencryptedtorecipient'spublickeyusinglong-termkeypair)(Base64),
     } (encryptedtorecipient'spublickeyusingephemeralkeypair)(Base64)}

    注意,用于加密 decryptInfo的nonce与用于加密 fileInfo的sso相同。 由于我们使用不同的密钥加密,因此允许在这个场景中使用 Nonce。

    ###4. 文件加密发件人首先生成一个新的临时 curve25519 密钥对,senderEphemeralSecretsenderEphemeralPublic

    长的发送方密钥被表示为 senderSecretsenderPublic

    收件人 a 长术语被表示为 recipientSecret[a]recipientPublic[a]

    发送方将邮件头开头的字节附加到 final 加密的文件。

    文件文件名用 0 x00字节填充,直到它的长度等于 256字节。 然后在加密前将文件名前置为明文。 文件名作为它自己的256-byte 块( 请参见以下块块格式) 加密。

    生成随机 32-byte fileKey 和随机 16-byte fileNonce,使用tweetnacl构造的xsalsa20-poly1305 对明文字节进行对称加密。 我们通过将明文分割成 1048576个-byte块来加密纯文本字节。 然后,使用下面的模型对每个块进行加密:

    fullNonce0 = fileNonce ||0encryptedChunk0 =length(chunk0) ||nacl.secretbox(chunk0, fullNonce0, fileKey)
    fullNonce1 = fileNonce ||1encryptedChunk1 =length(chunk1) ||nacl.secretbox(chunk1, fullNonce1, fileKey)...

    在 上面 示例中,通过连接 16-byte fileNonce 和 8-byte 小结尾块号来获取 24-byte fullNonce。 此外,length(chunk) 是一个 4-byte 小的前端文本块长度。

    最后一个块按如下方式加密:

    fullNonceN = fileNonce ||setMostSignificantBit(N)
    encryptedChunkN =length(chunkN) ||nacl.secretbox(chunkN, fullNonceN, fileKey)

    发件人生成一个包含 fileKeyfileNoncefileHashfileInfo JSON对象。 对于每个收件人,发送者使用 senderSecretrecipientPublic[n] 加密 fileInfo,并将它的存储在 decryptInfo 对象 inside 和 senderID 中,如下面的§3所述。

    decryptInfo 属性中存储上述元素的NAME 是一个 24-byte 临时元素。 发送者使用这个nonce和 senderEphemeralSecret,使用tweetnacl构造的curve25519-xsalsa20-poly1305,将底层JSON对象与 recipientPublic[n] 不对称地加密。 注意,对于每个收件人都执行一次,为每个收件人创建一个不同的decryptInfo 对象,每个收件人都以它的唯一的nonces为标签。

    最后,发送方追加标题末尾的字节,后跟文本字节。

    tweetnacl构造的curve25519-xsalsa20-poly1305 提供经过认证的加密,保证保密性和密文完整性。 上面 头构造使得无法通过分析密文来确定minilock加密文件的发送者或者收件人。

    为了解密文件,###5. 文件解密,收件人需要存储在页眉的decryptInfo 部分中的信息。 它们还需要标头的ephemeral 属性,以便导出共享密钥,并且可以用它们的长期密钥解密 decryptInfo 头。

    如果 decryptInfo 中有多个属性,接收方必须遍历每个属性,直到她获得对底层对象的经过验证的解密。 成功地对 decryptInfo 属性进行身份验证后,收件人就可以使用获得的senderID 和长期密钥来解密 fileKey,并将它的与 fileNonce 一起使用以执行密文字节的验证解密。

    在文件解密之前或者期间,收件人将密文的32-byte BLAKE2s 散列与解密的fileHash 进行比较。 接收者还将解密的recipientID 与他们自己的miniLock ID进行比较。 如果这些检查失败,则中止解密,并返回错误。

    为了解密密文字节,收件人将密文分成由原始 1048576字节组成的块,以及定义该特定密文块的身份验证代码的4字节和定义的字节。 然后,使用下面的模型依次解密每个块:

    fullNonce0 = fileNonce ||0decryptedChunk0 =nacl.secretbox.open(chunk0, fullNonce0, fileKey)
    fullNonce1 = fileNonce ||1decryptedChunk1 =nacl.secretbox.open(chunk1, fullNonce1, fileKey)...

    解密后,收件人从明文的第一个 256字节中检索文件名。 收件人从文件名中去除 padding 字节,现在可以保存解密的文件。

    如果任何头对象的身份验证不对称解密失败,或者文件密码的身份验证对称解密失败并返回错误。

    密钥验证中的密钥身份认证可以大大大于 miniLock id,因此必须生成密钥指纹,然后才可以用于out-of-band密钥身份验证。 使用 miniLock,用户可以使用 miniLock,直接身份验证 out-of-band,因为它的长度很小( 大约 45个Base58-encoded字符)。 因此,不需要专门的密钥身份认证机制。

    当运行加密或者解密错误时,###7. 错误代码miniLock将输出这些错误代码。 然后用户界面可以处理这些错误,以便显示与用户相关的信息:

    加密错误

    • Error 1: 常规加密错误

    解密错误

    • Error 2: 常规解密错误
    • Error 3: 无法解析标头
    • Error 4: 无效的标题版本
    • Error 5: 无法验证发件人 ID
    • Error 6: 这里收件人没有加密文件
    • Error 7: 无法验证密文哈希

    ###8. 警告miniLock不打算保护发送和接收的恶意文件。 用户有责任通过miniLock检查他们发送或者接收的文件的安全性。 miniLock无法防止恶意软件通过它发送。

    ###9. 感谢你的致谢。 ,Green,and。 Patterson,他在这篇文档的早期草稿上给出了反馈。

    Sincere感谢Trevor在设计minilock方面的宝贵贡献,他在密文中介绍了发送者身份匿名性。

    真正感谢,Chestnykh将TweetNaCL移植到JavaScript和miniLock项目的一般合作中,包括很多有用的和关键的建议。

    真诚感谢你的光临。 在 Cure53 中,Mario Heiderich和他的团队为执行对miniLock代码的全面审计工作。 我们也真诚感谢开放技术基金为审计提供资金。

    最后,给出了miniLock社区的精致成员,为miniLock设计和代码提供了许多改进和想法。 你摇滚 !

    ###10. 信用 ####miniLock 版权所有 2014 Nadim Kobeissi。 在AGPLv3许可证下发布。

    ,,,。

    ####TweetNaCL-JS Dmitry Chestnykh,设备 Mandiri

    ####scrypt


    文件  encrypt  加密  LESS  
    相关文章