Brian,
Good suggestion.

Easy-peasy. Php has a nice function to generate random iv vectors, so I’ll put 
it in.  Thanks for the suggestion!

Best,
Bill

William Prothero
http://earthlearningsolutions.org

> On Jul 3, 2018, at 9:31 AM, Brian Milby <br...@milby7.com> wrote:
> 
> I just put the PHP on my server and it was able to handle the randombytes IV 
> without issue.
> 
> The demo does not generate a new IV for the returned data which it really 
> should in production.
> 
> From a security perspective, you assume that an attacker has access to the 
> code. From the encrypted message, an attacker could figure out your next IV.
>> On Jul 3, 2018, 1:56 AM -0400, William Prothero <waproth...@gmail.com>, 
>> wrote:
>> Brian, thanks for the feedback.
>> 
>> I started by using random bytes, which was ok, but the php base64encode 
>> would only encode characters. So, I couldn’t get the return message to 
>> decode in LC correctly. I forget, it could have been the LC decode step, but 
>> the upshot was that I decided to go with valid ascii characters for iv 
>> because of this.
>> 
>> I don’t understand the problem with using the milliseconds to generate the 
>> random seed, though. The least significant digits of the milliseconds only 
>> depends on the random time the user first initiates the query. I assumed the 
>> milliseconds counts up to some maximum integer number, then repeats. Hmm, 
>> maybe I need to investigate how the counting goes. I had assumed it was just 
>> an integer number that counted until it overflowed, then started again from 
>> zero. I can investigate this.
>> 
>> What would the H(MAC) consist of? I haven’t heard of it.
>> 
>> Best,
>> Bill
>> 
>> William Prothero
>> http://earthlearningsolutions.org
>> 
>> On Jul 2, 2018, at 9:57 PM, Brian Milby <br...@milby7.com> wrote:
>> 
>>> I would suggest using "randombytes" instead of "random" on desktop/server 
>>> (according to dictionary is isn't available in mobile, but I have not 
>>> actually verified).  That uses the openssl library to generate random 
>>> numbers.  The problem with using an IV based on a pseudorandom number 
>>> generator seeded from something derived from the time means that it is 
>>> potentially predictable.
>>> 
>>> I was playing around with a function to generate an IV that is guaranteed 
>>> to not repeat.  The middle 4 bytes are the seconds, so it reduces the 
>>> randomness by 4 bytes.  I'm not sure how much of an issue that would be.  
>>> It does avoid the birthday problem (which should not really be an issue 
>>> with a good random number generator I would guess).  Maintaining your own 
>>> counter would be another option.  Ensuring uniqueness and unpredictability 
>>> is the goal.
>>> 
>>> One other thing that I was reading is that we should also include a (H)MAC 
>>> after the encryption to ensure that the payload is not tampered with.  We 
>>> would then only decrypt if the message had not been changed (and the IV 
>>> would be included in the MAC calculation).
>>> 
>>> Below is the code that I was experimenting with:
>>> 
>>> function generateIV pLength
>>>    local tSeconds, tBytes
>>>    
>>>    put randomBytes(6) into tBytes
>>>    put the seconds into tSeconds
>>>    repeat until tSeconds < 256
>>>       put numToByte(tSeconds mod 256) after tBytes
>>>       put tSeconds div 256 into tSeconds
>>>    end repeat
>>>    put numToByte(tSeconds) after tBytes
>>>    
>>>    if pLength is empty then put 16 into pLength
>>>    subtract length(tBytes) from pLength
>>>    if pLength < 0 then
>>>       delete byte 1 to (- pLength) of tBytes
>>>    else
>>>       put randomBytes(pLength) after tBytes
>>>    end if
>>>    return tBytes
>>> end generateIV
>>> 
>>>> On Mon, Jul 2, 2018 at 10:37 PM, William Prothero via use-livecode 
>>>> <use-livecode@lists.runrev.com> wrote:
>>>> Folks:
>>>> I’ve been working on a sample stack to demonstrate encryption, best 
>>>> practices (as far as I can determine).
>>>> The online lessons are not adequate for a robust solution to this vital 
>>>> security issue. I’ve posted a demo stack at: 
>>>> http://earthlearningsolutions.org/google-static-maps-demo/ 
>>>> <http://earthlearningsolutions.org/google-static-maps-demo/>  This stack 
>>>> has benefited from feedback and ideas from folks on this list. Feedback is 
>>>> welcome.
>>>> 
>>>> This stack generates a random iv vector and uses AES-256 encryption to 
>>>> encode an array containing commands for interaction with a mySQL server. 
>>>> The server side php script that decodes the data and encodes the returned 
>>>> response is included.
>>>> 
>>>> On thing I am still unsure about is the best way to generate a random 
>>>> string of characters that I use for the random IV (initialization vector) 
>>>> that is used for the encryption. I’ve included some code below, which is 
>>>> used to encrypt and decrypt the data sent and returned from the server. 
>>>> The encode and decode scripts are put into the launcher, or stack that is 
>>>> created when a standalone or mobile version is built.
>>>> 
>>>> Here are the handlers. The encryption key will be more secure if it is 
>>>> obfuscated by putting it in as a property of a control or hidden in some 
>>>> way. I am wondering if the generation of the random seed is optimum.
>>>> 
>>>> Feedback welcome.
>>>> 
>>>> local theRandomSeed
>>>> 
>>>> function randomChrs n
>>>>    if theRandomSeed = "" then
>>>>       setRandomSeed
>>>>    end if
>>>>    put "" into tChars
>>>>    repeat with i=1 to n
>>>>       put random(256) into nChar
>>>>       put numToNativeChar(nChar) after tChars
>>>>    end repeat
>>>>    return tChars
>>>> end randomChrs
>>>> 
>>>> on setRandomSeed
>>>>    put (the milliseconds) into tMS
>>>>    put trunc(tMs/10000000) into tDiv
>>>>    put tMS mod tDiv into theRandomSeed
>>>>    set the randomseed to theRandomSeed
>>>> end setRandomSeed
>>>> 
>>>> function theRandomIV
>>>>    if theRandomSeed = "" then
>>>>       setRandomSeed
>>>>    end if
>>>>    put randomChrs(16) into tIVBytes
>>>>    return tIVBytes
>>>> end theRandomIV
>>>> 
>>>> --This handler encodes the data. First it generates a random
>>>> --initialization vector (iv), then encrypts the data and puts
>>>> --adds iv to the encoded data.
>>>> --tArray is an array that controls the action of the php script.
>>>> function theEncoded tArray
>>>>    put  theRandomIV() into tIV
>>>>    put base64Encode(tIV) into tB64IV
>>>>    put ArrayToJSON(tArray,"string”,”") into tJson
>>>>    put "AFBDDFCFBDBBDDCCFFACGHDFFFFEEDCC" into tEncryptionKey
>>>>    put "AES-256-CTR" into tCipher
>>>>    encrypt tJson using tCipher with key tEncryptionKey and iV tIV
>>>>    put base64encode(it) into tDataToSend
>>>>    --comment out next statement if iv not included in data
>>>>    put tB64IV&tDataToSend into tDataToSend
>>>>    return tDataToSend
>>>> end theEncoded
>>>> 
>>>> --This decodes the data that is returned by the php on the
>>>> --remote server.
>>>> --The iv is expected as the first 24 bytes of the returned data.
>>>> function theDecoded tData
>>>>    put byte 1 to 24 of tData into tIVB64
>>>>    put base64decode(tIVB64) into tIV
>>>>    put the number of bytes in tData into n
>>>>    put byte 25 to n of tData into tRetB64Data
>>>>    put base64decode(tRetB64Data) into tRetData
>>>>    put "AES-256-CTR" into tCipher
>>>>    put "AFBDDFCFBDBBDDCCFFACGHDFFFFEEDCC" into tEncryptionKey
>>>>    decrypt tRetData using tCipher with key tEncryptionKey and iV tIV
>>>>    put it into tReturn
>>>>    return tReturn
>>>> end theDecoded
>>>> -- End of handlers that should be in the main stack
>>>> 
>>>> _______________________________________________
>>>> use-livecode mailing list
>>>> use-livecode@lists.runrev.com
>>>> Please visit this url to subscribe, unsubscribe and manage your 
>>>> subscription preferences:
>>>> http://lists.runrev.com/mailman/listinfo/use-livecode
>>> 
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to