You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by am...@apache.org on 2017/03/03 08:09:00 UTC

svn commit: r1785225 - in /jackrabbit/trunk: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/ jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/ jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/db/

Author: amitj
Date: Fri Mar  3 08:09:00 2017
New Revision: 1785225

URL: http://svn.apache.org/viewvc?rev=1785225&view=rev
Log:
JCR-4115: Don't use SHA-1 for new DataStore binaries (Jackrabbit)

- Using SHA-256 instead of SHA-1 to create blob record ids

Modified:
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/DataStoreTest.java
    jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java
    jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/CachingDataStore.java
    jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java
    jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/DataStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/DataStoreTest.java?rev=1785225&r1=1785224&r2=1785225&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/DataStoreTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/DataStoreTest.java Fri Mar  3 08:09:00 2017
@@ -26,6 +26,9 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.ArrayList;
@@ -103,14 +106,35 @@ public class DataStoreTest extends JUnit
         }
     }
 
+    public static void main(String... args) throws NoSuchAlgorithmException {
+        // create and print a "directory-collision", that is, two byte arrays
+        // where the hash starts with the same bytes
+        // those values can be used for testDeleteRecordWithParentCollision
+        HashMap<Long, Long> map = new HashMap<Long, Long>();
+        MessageDigest digest = MessageDigest.getInstance("SHA-256");
+        ByteBuffer input = ByteBuffer.allocate(8);
+        byte[] array = input.array();
+        for(long x = 0;; x++) {
+            input.putLong(x).flip();
+            long h = ByteBuffer.wrap(digest.digest(array)).getLong();
+            Long old = map.put(h & 0xffffffffff000000L, x);
+            if (old != null) {
+                System.out.println(Long.toHexString(old) + " " + Long.toHexString(x));
+                break;
+            }
+        }
+    }
+
     public void testDeleteRecordWithParentCollision() throws Exception {
         FileDataStore fds = new FileDataStore();
         fds.init(testDir + "/fileDeleteCollision");
 
-        String c1 = "06b2f82fd81b2c20";
-        String c2 = "02c60cb75083ceef";
-        DataRecord d1 = fds.addRecord(IOUtils.toInputStream(c1));
-        DataRecord d2 = fds.addRecord(IOUtils.toInputStream(c2));
+        ByteArrayInputStream c1 = new ByteArrayInputStream(ByteBuffer
+                .allocate(8).putLong(0x181c7).array());
+        ByteArrayInputStream c2 = new ByteArrayInputStream(ByteBuffer
+                .allocate(8).putLong(0x11fd78).array());
+        DataRecord d1 = fds.addRecord(c1);
+        DataRecord d2 = fds.addRecord(c2);
         fds.deleteRecord(d1.getIdentifier());
         DataRecord testRecord = fds.getRecordIfStored(d2.getIdentifier());
 

Modified: jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java?rev=1785225&r1=1785224&r2=1785225&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractDataStore.java Fri Mar  3 08:09:00 2017
@@ -37,6 +37,11 @@ public abstract class AbstractDataStore
     private static final char[] HEX = "0123456789abcdef".toCharArray();
 
     /**
+     * The digest algorithm used to uniquely identify records.
+     */
+    protected String DIGEST = System.getProperty("ds.digest.algorithm", "SHA-256");
+
+    /**
      * Cached copy of the reference key of this data store. Initialized in
      * {@link #getReferenceKey()} when the key is first accessed.
      */
@@ -138,4 +143,4 @@ public abstract class AbstractDataStore
         return referenceKey;
     }
 
-}
\ No newline at end of file
+}

Modified: jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/CachingDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/CachingDataStore.java?rev=1785225&r1=1785224&r2=1785225&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/CachingDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/CachingDataStore.java Fri Mar  3 08:09:00 2017
@@ -90,11 +90,6 @@ public abstract class CachingDataStore e
      */
     private static final Logger LOG = LoggerFactory.getLogger(CachingDataStore.class);
 
-    /**
-     * The digest algorithm used to uniquely identify records.
-     */
-    private static final String DIGEST = "SHA-1";
-
     private static final String DS_STORE = ".DS_Store";
 
     /**
@@ -389,9 +384,9 @@ public abstract class CachingDataStore e
 
     /**
      * Creates a new data record in {@link Backend}. The stream is first
-     * consumed and the contents are saved in a temporary file and the SHA-1
+     * consumed and the contents are saved in a temporary file and the {@link #DIGEST}
      * message digest of the stream is calculated. If a record with the same
-     * SHA-1 digest (and length) is found then it is returned. Otherwise new
+     * {@link #DIGEST} digest (and length) is found then it is returned. Otherwise new
      * record is created in {@link Backend} and the temporary file is moved in
      * place to {@link LocalCache}.
      * 
@@ -423,7 +418,7 @@ public abstract class CachingDataStore e
             long currTime = System.currentTimeMillis();
             DataIdentifier identifier = new DataIdentifier(
                 encodeHexString(digest.digest()));
-            LOG.debug("SHA1 of [{}], length =[{}] took [{}]ms ",
+            LOG.debug("Digest of [{}], length =[{}] took [{}]ms ",
                 new Object[] { identifier, length, (currTime - startTime) });
             String fileName = getFileName(identifier);
             AsyncUploadCacheResult result = null;

Modified: jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java?rev=1785225&r1=1785224&r2=1785225&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java Fri Mar  3 08:09:00 2017
@@ -69,11 +69,6 @@ public class FileDataStore extends Abstr
     private static Logger log = LoggerFactory.getLogger(FileDataStore.class);
 
     /**
-     * The digest algorithm used to uniquely identify records.
-     */
-    private static final String DIGEST = "SHA-1";
-
-    /**
      * The default value for the minimum object size.
      */
     private static final int DEFAULT_MIN_RECORD_LENGTH = 100;
@@ -163,8 +158,8 @@ public class FileDataStore extends Abstr
     /**
      * Creates a new data record.
      * The stream is first consumed and the contents are saved in a temporary file
-     * and the SHA-1 message digest of the stream is calculated. If a
-     * record with the same SHA-1 digest (and length) is found then it is
+     * and the {@link #DIGEST} message digest of the stream is calculated. If a
+     * record with the same {@link #DIGEST} digest (and length) is found then it is
      * returned. Otherwise the temporary file is moved in place to become
      * the new data record that gets returned.
      *

Modified: jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java?rev=1785225&r1=1785224&r2=1785225&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java Fri Mar  3 08:09:00 2017
@@ -126,11 +126,6 @@ public class DbDataStore extends Abstrac
     public static final String STORE_SIZE_MAX = "max";
 
     /**
-     * The digest algorithm used to uniquely identify records.
-     */
-    protected static final String DIGEST = "SHA-1";
-
-    /**
      * The prefix used for temporary objects.
      */
     protected static final String TEMP_PREFIX = "TEMP_";