Search code examples
grailspasswordszipgrails-plugingrails-controller

put password to a zip file in grails errors


as I can put a password on a zip file grails

package zip
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream

class SampleZipController {
def index() { }
def downloadSampleZip() {
    response.setContentType('APPLICATION/OCTET-STREAM')
    response.setHeader('Content-Disposition', 'Attachment;Filename="example.zip"')
    ZipOutputStream zip = new ZipOutputStream(response.outputStream);

    def file1Entry = new ZipEntry('first_file.txt');
    zip.putNextEntry(file1Entry);
    zip.write("This is the content of the first file".bytes);   
    def file2Entry = new ZipEntry('second_file.txt');
    zip.putNextEntry(file2Entry);
    zip.write("This is the content of the second file".bytes);
    zip.setPassword("password");

    zip.close();

}
} 

The problem is that I put the setPassword property and does not create any zip file case 'm getting the wrong word reserved.


Solution

  • OK, here's the deal. The Java SDK does not provide password protection for zip files. ZipOutputStream.setPassword() does not exist, nor does any other method to set a password.

    What you can do is use a third-party library instead. Here's a Groovy script demonstrating how to password protect a ZIP file using Winzipaes:

    @Grab('de.idyl:winzipaes:1.0.1')
    
    import de.idyl.winzipaes.AesZipFileEncrypter
    import de.idyl.winzipaes.impl.AESEncrypterBC
    
    def outputStream = new FileOutputStream('test.zip') /* Create an OutputStream */
    def encrypter = new AesZipFileEncrypter(outputStream, new AESEncrypterBC())
    def password = 'password'
    
    encrypter.add('first_file.txt', new ByteArrayInputStream('This is the content of the first file'.bytes), password)
    encrypter.add('second_file.txt', new ByteArrayInputStream('This is the content of the second file'.bytes), password)
    encrypter.close()
    

    As you can see the API is similar to the one you were using. Keep in mind this is a Groovy script without Grails, so ensure to add the Winzipaes dependency appropriately (don't use @Grab).

    Note: The encryption algorithm is AES256, which is not supported by all ZIP clients. For example, on Mac OSX I had to install 7-zip to decrypt the file; the built-in ZIP tools did not work.

    You can read more about password-protecting ZIP files here.