¿La misma cadena cifrada con la misma clave no genera el mismo valor cifrado?

3

Esta es mi página y clase para cifrar la cadena introducida y guardada en la base de datos. Cada vez, el Key__c es el mismo, como lo tomo de la configuración personalizada. Pero cuando ingreso abc y guardo dos veces, el valor ingresado es diferente. ¿Cuál es la razón?

<apex:page controller="encryptNewController">
    <apex:form >   
         <apex:outPutLabel value="Encrypted by Code"/>
         <apex:inputsecret value="{!encryptedByCode}"/>


         <apex:commandButton value="Save" action="{!saveValues}"/>
         <apex:outputText value="{!decryptedDataString}"/>
    </apex:form>
</apex:page>


public with sharing class encryptNewController {

     Public Encrypt_Object__c encryptObject {get;set;}
     Public String encryptedByCode {get;set;}
     Public String decryptedDataString {get;set;}
     Blob cryptoKey;
     public encryptNewController(){
          encryptObject=new Encrypt_Object__c();
     }
     public void saveValues(){
            List<CryptoKey__c> keyValue = [SELECT  Key__c FROM CryptoKey__c where id != null];
                String cryptoKeyString;
                System.debug('000000000000000000000000000000000000000000keyValue'+keyValue);
                if(keyValue.size() > 0){
                    cryptoKeyString = keyValue[0].Key__c;
                    cryptoKey = EncodingUtil.base64Decode(cryptoKeyString);
                System.debug('000000000000000000000000000000000000000000cryptoKey'+cryptoKey);
            }           
            encryptObject.Encrypted_by_Code__c = encryptToken(encryptedByCode);

            insert encryptObject;
            Encrypt_Object__c insertedencryptObject = [Select id,Encrypted_by_Code__c from Encrypt_Object__c where id=: encryptObject.id][0];
            decryptedDataString =decryptToken(insertedencryptObject.Encrypted_by_Code__c);            
     }

     public String encryptToken(String strOriginal){
        Blob encryptedData;
        if(cryptoKey != null){
            String strUrlUTF8 = EncodingUtil.urlEncode(strOriginal, 'UTF-8');
            Blob b = Blob.valueOf(strUrlUTF8);
            System.debug('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@cryptoKey'+cryptoKey);
            encryptedData = Crypto.encryptWithManagedIV('AES256', cryptoKey, b);
            return  EncodingUtil.base64Encode(encryptedData);
        }else{
            return null;
        }

      }

      public String decryptToken(String encryptedString){
        if(cryptoKey != null){
         Blob b = EncodingUtil.base64Decode(encryptedString);
         Blob decryptedData = Crypto.decryptWithManagedIV('AES256', cryptoKey, b);
         String strUrlUTF8 = decryptedData.toString();
         return EncodingUtil.urlDecode(strUrlUTF8, 'UTF-8');
        }else{
            return null;
        }
      }   
}
================================================

¿La misma cadena cifrada con la misma clave no genera el mismo valor cifrado?

    
pregunta jyothy 09.04.2014 - 08:08
fuente

2 respuestas

4

La mayoría de los esquemas de cifrado están diseñados para que el cifrado del mismo valor genere dos valores cifrados diferentes. Esta es una propiedad de seguridad.

Se dice que los esquemas de cifrado de tal manera que cifrar el mismo valor dos veces en el mismo texto cifrado son deterministas. El cifrado determinista es necesario en algunas aplicaciones, pero debe evitarse por defecto.

Considere el siguiente escenario: un servidor está dispuesto a dejarme cargar documentos y cifrarlos, pero no a dejarme descifrar documentos. Digamos que quiero saber el contenido del documento de otra persona. Hago algunas conjeturas y las envío al servidor, para obtener el texto cifrado correspondiente a mis conjeturas. Si el esquema de cifrado es determinístico, entonces puedo comparar los textos cifrados de mis conjeturas con el texto cifrado del documento confidencial. Con un esquema de cifrado que incluye un elemento aleatorio, incluso si mi suposición es correcta, el texto cifrado será diferente; por lo tanto, un esquema de cifrado aleatorio puede proporcionar seguridad semántica , pero un esquema determinista no puede.

La mayoría de los esquemas de cifrado simétrico incluyen un vector de inicialización (IV) u otro elemento que sea diferente (a menudo aleatorio, pero los requisitos varían según el algoritmo) cada vez que se realiza un cifrado. Muchos esquemas de encriptación asimétrica incluyen relleno al azar para el mismo efecto.

Entonces, es normal que cifrar el mismo valor dos veces produzca resultados diferentes. De hecho, a menos que haya establecido la necesidad de un cifrado determinista, obtener el mismo valor dos veces sería una señal de que algo está mal. Si está probando su aplicación, no puede probar el texto cifrado contra un valor conocido, necesita descifrarlo de forma independiente.

    
respondido por el Gilles 09.04.2014 - 15:10
fuente
2

Parece que encryptWithManagedIV () genera un IV aleatorio cada vez que lo usas. Por lo tanto, diferentes textos cifrados (que es bueno por cierto). Consulte aquí :

  

Use la función encryptWithManagedIV () para que Salesforce genere   el IV para usted en los primeros 16 bytes del texto cifrado.

    
respondido por el Andrey 09.04.2014 - 09:52
fuente

Lea otras preguntas en las etiquetas