La stessa stringa crittografata con la stessa chiave non genera lo stesso valore crittografato?

4

Questa è la mia pagina e classe per crittografare la stringa inserita e salvata nel database. Ogni volta, il Key__c è lo stesso, poiché lo prendo dalle impostazioni personalizzate. Ma quando inserisco abc e salvo due volte, il valore inserito è diverso. Qual è la ragione?

<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 stessa stringa crittografata con la stessa chiave non genera lo stesso valore crittografato?

    
posta jyothy 09.04.2014 - 08:08
fonte

2 risposte

5

La maggior parte degli schemi di crittografia è progettata in modo tale che la crittografia dello stesso valore genera due volte valori crittografati diversi. Questa è una proprietà di sicurezza.

Gli schemi di crittografia in modo tale che la crittografia dello stesso valore due volte risulti nello stesso testo cifrato si dice che siano deterministici. La crittografia deterministica è necessaria in alcune applicazioni, ma dovrebbe essere evitata di default.

Considera il seguente scenario: un server è disposto a farmi caricare i documenti e crittografarli, ma non a consentirmi di decodificare i documenti. Diciamo che voglio sapere il contenuto del documento di qualcun altro. Faccio qualche ipotesi e li invio al server, per ottenere il testo cifrato corrispondente alle mie ipotesi. Se lo schema di crittografia è deterministico, allora posso confrontare i testi cifrati per le mie ipotesi con il testo cifrato per il documento confidenziale. Con uno schema di crittografia che include un elemento casuale, anche se la mia ipotesi è corretta, il testo cifrato sarà diverso, quindi uno schema di crittografia randomizzato può fornire sicurezza semantica , ma uno schema deterministico non può.

La maggior parte degli schemi di crittografia simmetrica include un vettore di inizializzazione (IV) o un altro elemento diverso (spesso casuale, ma il i requisiti variano a seconda dell'algoritmo) ogni volta che viene eseguita una crittografia. Molti schemi di crittografia asimmetrici includono random padding per lo stesso effetto.

Quindi è normale che la crittografia dello stesso valore due volte produca risultati diversi. In effetti, a meno che tu non abbia stabilito un bisogno di crittografia deterministica, ottenere lo stesso valore due volte sarebbe un segno che qualcosa non va. Se stai testando la tua applicazione, non puoi testare il testo cifrato su un valore noto, devi decodificarlo in modo indipendente.

    
risposta data 09.04.2014 - 15:10
fonte
2

Sembra che encryptWithManagedIV () generi casuale IV ogni volta che lo usi. Quindi, diversi testi cifrati (che è buono a proposito di BTW). Vedi qui :

Use the encryptWithManagedIV() function to have Salesforce generate the IV for you in the first 16 bytes of the cipher text.

    
risposta data 09.04.2014 - 09:52
fonte

Leggi altre domande sui tag