Just to note that I once needed this and even commented on Stack Overflow
about it:
http://stackoverflow.com/questions/166340/write-a-password-protected-zip-file-in-java

I'd just note that setting the password on each entry is a bit painful, as
you'd normally expect to just set the password once. But having the feature
in the JDK is better than not. Having pluggable encryption will I suspect
be useful though, because the encryption used will no doubt change over
time.

Stephen


On 5 January 2016 at 22:10, Xueming Shen <xueming.s...@oracle.com> wrote:

> Yuji,
>
> I'm not convinced that the ZipCryption is a public interface we'd like to
> expose,
> at least for now, given the proprietary nature of the "strong encryption"
> defined
> by PKWARE.
>
> As I said in my previous email, it might be desired to hide the
> "passwd/encryption"
> support for the "traditional zip encryption" as an implementation detail.
>
> Looking at the existing methods that deal with "entry" in ZipFile,
> ZipInputStream
> and ZipOutputStream,
>
> ZipFile.getInputStream(ZipEntry e);
> ZipOutputStream.putNextEntry(ZipEntry e);
> ZipInputStream.getNextEntry();
>
> it appears that instead of adding "password" specific method to these
> classes
> directly, it might be more appropriate to extend the ZipEntry class for
> such
> "password" functionality. For example, with a pair of new methods
>
> boolean ZipEntry.isTraditionalEncryption().
> void ZipEntry.setTraditionalEncryption(String password);
>
> The encryption support should/can be added naturally/smoothly with
> ZipFile.getInputStream(e), ZipInputstream and
> ZipOutputStream.putNextEntry(e),
> with no extra new method in these two classes. The implementation checks
> the flag (bit0, no bit 6) first and then verifies the password, as an
> implementation
> details.
>
> For ZipFile and ZipInputStream, we can add note to the api doc to force the
> invoker to check if the returned ZipEntry indicates it's an encrypted
> entry. If yes,
> it must to set the appropriate password to the returned ZipEntry via
> ZipEntry.setTraditionalEncryption(password); before reading any byte from
> the
> input stream.
>
> Again, we should not have any "encryption" related public field/method in
> DeflaterOutputStream/InflaterInputStream. Ideally these two classes really
> should
> not be aware of "encryption" at all.
>
> -Sherman
>
>
>
> On 01/04/2016 06:26 AM, KUBOTA Yuji wrote:
>
>> Hi Sherman and all,
>>
>> Happy new year to everyone!
>>
>> Please let know your feedback about this proposal. :-)
>>
>> Thanks,
>> Yuji
>>
>> 2015-12-21 22:38 GMT+09:00 KUBOTA Yuji<kubota.y...@gmail.com>:
>>
>>> Hi Sherman,
>>>
>>> 2015-12-20 16:35 GMT+09:00 Xueming Shen<xueming.s...@oracle.com>:
>>>
>>>> It is no longer necessary to touch the native code (zip_util.c/h) after
>>>> the
>>>> native ZipFile implementation has been moved up to the java level. Those
>>>> native code are for vm access only now, which I dont think care about
>>>> the
>>>> password support at all.
>>>>
>>> Thanks for your information. We do not take care the native.
>>>
>>> I discussed with Yasumasa, and our thought is as below.
>>>
>>> (1) what's the benefit of exposing the public interface ZipCryption? the
>>>> real
>>>> question is whether or not this interface is good enough for other
>>>> encryption
>>>> implementation to plugin their implementation to support the
>>>> ZipFile/Input/
>>>> OutputStream to their encryption spec.
>>>>
>>> We aimed that the public interface ZipCryption supports the
>>> extensibillity for other encrypt engine. The JDK core libs developers
>>> have to implementation ZipyCryption only. If not provide, the JDK
>>> developers must implement ZipStream/Entry by JDK API to design the
>>> data structure of entry.
>>> If you want to use binary key data such as PKI, you can implement new
>>> encrypt/decrypt engine by ZipCryption interface.
>>> So we think we should provide this interface to be clearly how to
>>> implement a new engine, e.g., cipher algorithm, cipher strength and
>>> converting the header, etc.
>>>
>>> (2) it seems like it might be possible to hide most of the implementation
>>>> and only expose the "String password" (instead of the ZipCryption) as
>>>> the
>>>> public interface to support the "traditional" encryption. This depends
>>>> on the
>>>> result of (1) though.
>>>>
>>> Thanks for your clues. We think the string password at first. However,
>>> we should also create a new binary interface given we support PKI in
>>> the future.
>>>
>>> (3) I'm concerned of pushing ZipCryption into
>>>> InflaterInputStream/DeflaterOutputStream.
>>>> It might be worth considering to replace the ZipCryption implementation
>>>> with
>>>> a pair of FilterOutput/InputStream. It would be easy and reasonable to
>>>> use
>>>> the FilterOutputStream for the ZipOutputStream and the
>>>> FilterInputStream for the
>>>> ZipFile. The PushbackInputStream in ZipInputStream might be an issue ...
>>>>
>>> Thanks for your clues, too. Honestly speaking, we think the current
>>> zip implementation may break the data when used PushbackInputStream
>>> for the following reasons.
>>>
>>> * PushbackInputStream uses an unique internal buffer for re-read
>>> operation.
>>> * But, InflaterInputStream provide date to Inflater per reads and
>>> buffer by JNI (zlib).
>>> * So we think PushbackInputStream is poor compatibility with
>>> InflaterInputStream.
>>>
>>> We generally use InputStream through ZipEntry#getInputStream(). We do
>>> not touch FileInputStream for reading ZIP data. If we call unread()
>>> when we use PushbackInputStream as reading ZIP archive, we guess that
>>> it will break the reading data.
>>> So, our approach do not affect the PushbackInputStream.
>>> What do you think about this?
>>>
>>> (4) It seems the ZipOutputStream only supports the "stream based"
>>>> password, while
>>>> the ZipInputStream  supports the "entry based" password. Do we really
>>>> need
>>>> "entry based" support here?
>>>>
>>> As your suggestion, we should support "entry based". We will start to
>>> implement "entry based" after this discussion is closed.
>>>
>>> Thanks,
>>> Yuji
>>>
>>> On 12/17/15, 9:45 PM, Yasumasa Suenaga wrote:
>>>>
>>>>> Hi Jason,
>>>>>
>>>>> Thank you for your comment.
>>>>> I've fixed it in new webrev:
>>>>>    http://cr.openjdk.java.net/~ysuenaga/JDK-4347142/webrev.03/
>>>>>
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Yasumasa
>>>>>
>>>>>
>>>>> On 2015/12/17 0:33, Jason Mehrens wrote:
>>>>>
>>>>>> The null check of 'entry' at line 351 of ZipFile.getInputStream  is in
>>>>>> conflict with line 350 and 348.
>>>>>>
>>>>>> ________________________________________
>>>>>> From: core-libs-dev<core-libs-dev-boun...@openjdk.java.net>  on
>>>>>> behalf of
>>>>>> Yasumasa Suenaga<yasue...@gmail.com>
>>>>>> Sent: Wednesday, December 16, 2015 8:47 AM
>>>>>> To: Sergey Bylokhov; Xueming Shen
>>>>>> Cc: core-libs-dev@openjdk.java.net
>>>>>> Subject: Re: [PING] PoC for JDK-4347142: Need method to set Password
>>>>>> protection to Zip entries
>>>>>>
>>>>>> Hi Sergey,
>>>>>>
>>>>>> Thank you for your comment.
>>>>>>
>>>>>> I added that description in new webrev:
>>>>>>      http://cr.openjdk.java.net/~ysuenaga/JDK-4347142/webrev.02/
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Yasumasa
>>>>>>
>>>>>>
>>>>>> On 2015/12/16 22:19, Sergey Bylokhov wrote:
>>>>>>
>>>>>>> Should the new methods describe how they will work in case of null
>>>>>>> params?
>>>>>>>
>>>>>>> On 16/12/15 16:04, Yasumasa Suenaga wrote:
>>>>>>>
>>>>>>>> I adapted this enhancement after JDK-8145260:
>>>>>>>>      http://cr.openjdk.java.net/~ysuenaga/JDK-4347142/webrev.01/
>>>>>>>>
>>>>>>>> Could you review it?
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>>
>>>>>>>> Yasumasa
>>>>>>>>
>>>>>>>>
>>>>>>>> On 2015/12/12 21:23, Yasumasa Suenaga wrote:
>>>>>>>>
>>>>>>>>> Hi Sherman,
>>>>>>>>>
>>>>>>>>> Our proposal is affected by JDK-8142508.
>>>>>>>>> We have to change ZipFile.java and and ZipFile.c .
>>>>>>>>> Thus we will create a new webrev for current (after 8142508)
>>>>>>>>> jdk9/dev
>>>>>>>>> repos.
>>>>>>>>>
>>>>>>>>> Do you have any comments about current webrev?
>>>>>>>>>      http://cr.openjdk.java.net/~ysuenaga/JDK-4347142/webrev.00/
>>>>>>>>>
>>>>>>>>> If you have comments, we will fix them in new webrev.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>>
>>>>>>>>> Yasumasa
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 2015/12/03 16:51, KUBOTA Yuji wrote:
>>>>>>>>>
>>>>>>>>>> Hi Sherman,
>>>>>>>>>>
>>>>>>>>>> Thanks for your quick response :)
>>>>>>>>>>
>>>>>>>>>> I aimed to implement the "traditional" at this proposal by the
>>>>>>>>>> below
>>>>>>>>>> reasons.
>>>>>>>>>>
>>>>>>>>>>     * We want to prepare API for encrypted zip files at first.
>>>>>>>>>>       * Many people use the "traditional" in problem-free scope
>>>>>>>>>> like a
>>>>>>>>>> temporary file.
>>>>>>>>>>     * We do not know which implementation of the "stronger" is
>>>>>>>>>> best
>>>>>>>>>> for
>>>>>>>>>> openjdk.
>>>>>>>>>>       * PKWare claims that they have patents about the "stronger"
>>>>>>>>>> on
>>>>>>>>>> Zip[1].
>>>>>>>>>>       * OTOH, WinZip have the alternative implementation of the
>>>>>>>>>> "stronger" [2][3].
>>>>>>>>>>     * Instead, we prepared the extensibility by ZipCryption
>>>>>>>>>> interface
>>>>>>>>>> to
>>>>>>>>>> implement other encrypt engine, such as the AES based.
>>>>>>>>>>
>>>>>>>>>> Thus, I think this PoC should support the "traditional" only.
>>>>>>>>>> In the future, anyone who want to implement the "stronger" can
>>>>>>>>>> easily
>>>>>>>>>> add their code by virtue of this proposal.
>>>>>>>>>>
>>>>>>>>>> [1] https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.3.TXT
>>>>>>>>>>        (1.4 Permitted Use&  7.0 Strong Encryption Specification)
>>>>>>>>>>
>>>>>>>>>> [2]
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> https://en.wikipedia.org/wiki/Zip_(file_format)#Strong_encryption_controversy
>>>>>>>>>>
>>>>>>>>>> [3] http://www.winzip.com/aes_info.htm
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Yuji
>>>>>>>>>>
>>>>>>>>>> 2015-12-03 12:29 GMT+09:00 Xueming Shen<xueming.s...@oracle.com>:
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Hi Yuji,
>>>>>>>>>>>
>>>>>>>>>>> I will take a look at your PoC.  Might need some time and even
>>>>>>>>>>> bring
>>>>>>>>>>> in the
>>>>>>>>>>> security guy
>>>>>>>>>>> to evaluate the proposal. It seems like you are only interested
>>>>>>>>>>> in
>>>>>>>>>>> the
>>>>>>>>>>> "traditional PKWare
>>>>>>>>>>> decryption", which is, based on the wiki, "known to be seriously
>>>>>>>>>>> flawed, and
>>>>>>>>>>> in particular
>>>>>>>>>>> is vulnerable to known-plaintext attacks":-) Any request to
>>>>>>>>>>> support
>>>>>>>>>>> "stronger" encryption
>>>>>>>>>>> mechanism, such as the AES based?
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> Sherman
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 12/2/15 6:48 PM, KUBOTA Yuji wrote:
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>
>>>>>>>>>>>> We need reviewer(s) for this PoC.
>>>>>>>>>>>> Could you please review this proposal and PoC ?
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> Yuji
>>>>>>>>>>>>
>>>>>>>>>>>> 2015-11-26 13:22 GMT+09:00 KUBOTA Yuji<kubota.y...@gmail.com>:
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>>
>>>>>>>>>>>>> * Sorry for my mistake. I re-post this mail because I sent
>>>>>>>>>>>>> before
>>>>>>>>>>>>> get
>>>>>>>>>>>>> a response of subscription confirmation of core-libs-dev.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Our customers have to handle password-protected zip files.
>>>>>>>>>>>>> However,
>>>>>>>>>>>>> Java SE does not provide the APIs to handle it yet, so we must
>>>>>>>>>>>>> use
>>>>>>>>>>>>> third party library so far.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Recently, we found JDK-4347142: "Need method to set Password
>>>>>>>>>>>>> protection to Zip entries", and we tried to implement it.
>>>>>>>>>>>>>
>>>>>>>>>>>>> The current zlib in JDK is completely unaffected by this
>>>>>>>>>>>>> proposal.
>>>>>>>>>>>>> The
>>>>>>>>>>>>> traditional zip encryption encrypts a data after it is has been
>>>>>>>>>>>>> compressed by zlib.[1] So we do NOT need to change existing
>>>>>>>>>>>>> zlib
>>>>>>>>>>>>> implementation.
>>>>>>>>>>>>>
>>>>>>>>>>>>> We've created PoC and uploaded it as webrev:
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-4347142/webrev.00/
>>>>>>>>>>>>>
>>>>>>>>>>>>>         Test code is as below. This code will let you know how
>>>>>>>>>>>>> this
>>>>>>>>>>>>> PoC
>>>>>>>>>>>>> works.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-4347142/webrev.00/Test.java
>>>>>>>>>>>>>
>>>>>>>>>>>>> In NTT, a Japanese telecommunications company. We are providing
>>>>>>>>>>>>> many
>>>>>>>>>>>>> enterprise systems to customers. Some of them, we need to
>>>>>>>>>>>>> implement to
>>>>>>>>>>>>> handle password-protected zip file. I guess that this proposal
>>>>>>>>>>>>> is
>>>>>>>>>>>>> desired for many developers and users.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I'm working together with Yasumasa Suenaga, jdk9 committer
>>>>>>>>>>>>> (ysuenaga).
>>>>>>>>>>>>> We want to implement it if this proposal accepted.
>>>>>>>>>>>>>
>>>>>>>>>>>>> [1]:
>>>>>>>>>>>>> https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.3.TXT
>>>>>>>>>>>>> (6.0  Traditional PKWARE Encryption)
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>> Yuji
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>
>

Reply via email to