Pergunta

Vamos dizer que eu tenho um arquivo criptografado em um iPhone e cada vez que eu quero para decifrá-lo, eu quero "desenhar" um símbolo descriptografia em vez de ter que usar um teclado para digitá-lo.

Se você solicitar ao usuário desenhar um símbolo para descriptografar um arquivo cada vez que for necessário (por exemplo, cada vez que lançar o seu aplicativo) eles provavelmente preferem a ter que digitar a 20 caracteres ou menos senha no teclado minúsculo , e eles ainda teria a segurança de uma senha de 20 caracteres daria a eles (dependendo de como complicado a forma / símbolo extraem é).

O símbolo que gostaria de chamar seria provavelmente um acidente vascular cerebral (por exemplo, é mais uma vez que você levante o dedo), mas pode ser muito complexo, de tal forma que é difícil para alguém para repeti-lo, mesmo que vê-lo desenhá-la no. assim como como a assinatura de cada pessoa é única e difícil de duplicar. Na verdade, este pode apenas excessivamente complicar-lo se ele tinha que evitar de ser duplicada, então por enquanto este pode ser ignorado e podemos supor que o símbolo não será visto por outra pessoa e, portanto, não importa se ele poderia ser repetido por eles ou não.

Eu acho que a verdadeira questão é como você converter o mesmo (razoavelmente) acidente vascular cerebral de forma consistente para a mesma chave (por exemplo, valor de hash). Há, obviamente, deve haver algum limite de perdão no algoritmo, porque o usuário não pode ser esperado para repetir o curso exatamente 100%.

Usando o símbolo como um método de decodificação acrescenta toda uma outra dimensão a este problema. Você nunca quer armazenar o valor em qualquer lugar de hash gerado em forma não criptografada, porque então alguém pode ser capaz de acesso que parte do disco rígido e obter a chave de decodificação sem a necessidade de passar por todo o processo de desenho e descriptografar o arquivo manualmente. Você também provavelmente não deseja armazenar nada sobre como a forma é desenhada.

Um exemplo bom de um acidente vascular cerebral que o usuário pode usar como seu símbolo descriptografia é o símbolo "&". Imagine um usuário desenho deste símbolo em seu iPhone cada vez que precisa para descriptografar um arquivo. O tamanho do símbolo pode não ser o mesmo cada vez que ele é desenhado. Além disso, a rotação do símbolo pode ser diferente, dependendo de como o usuário mantém o seu dispositivo. Idealmente, em ambos os casos, porque o símbolo foi desenhado, em relação aos acidentes vasculares cerebrais do usuário, o mesmo, ele deve ser capaz de gerar o mesmo valor de hash e, assim, descriptografar o arquivo.

Eu pensei algo como forma ou de reconhecimento de caracteres é um algoritmo similar. Onde o usuário desenha algo (razoavelmente representando uma forma) e, em seguida, corrige-lo para o formato correto, o que teria o mesmo valor hash cada vez que ele é desenhado. No entanto, para algo como isso, você provavelmente precisa de um banco de dados de formas que podem ser extraídas, e se você escolher algo como todas as letras do alfabeto, você só tem 26 letras. E supondo que o usuário só deve desenhar um símbolo para descriptografar o arquivo, você tem uma senha extremamente inseguro com apenas 26 possibilidades.

Outra coisa que pensei é que você poderia quebrar o símbolo que é desenhado em pequenos segmentos e, em seguida, executar o reconhecimento símbolo sobre aqueles. Então, imagine que você tem 4 símbolos em um banco de dados: linha vertical, linha horizontal, e diagonais em ambas as direções. Agora, como o utilizador retira, cada segmento é reconhecido como um destes, e, em seguida, todos eles são combinados para formar um valor de hash. Então, imagine o usuário escolheu como seu símbolo descriptografia a letra minúscula "r". Então eles iriam começar pelo desenho de um para baixo da linha vertical, seguido por uma linha vertical para cima, seguido por uma linha diagonal para cima e para a direita. Um problema com este método é como você saberia quando dividir o curso em segmentos individuais? Você provavelmente também quer ter em conta quanto tempo cada segmento individual é aproximadamente (por exemplo, em incrementos de 40 pixels). Dessa forma, se alguém desenhou um "r" deformado onde o corcunda sai perto do fundo não é reconhecida como os mesmos symbol e, portanto, não descriptografar o arquivo.

Um terceiro método pode ser dividir a tela para cima em uma grade (não tenho certeza que ainda tamanho) e simplesmente vendo em que as células do curso é desenhado e usar esses dados de alguma forma para gerar uma string.

Quaisquer outras idéias de como isso poderia ser implementado? Você já ouviu falar de algo assim? Existem quaisquer falhas fundamentais que impediriam um sistema como este de trabalhar?

Graças

Foi útil?

Solução

O problema de criptografar dados com keymaterial que podem ter pequenos erros tem sido estudado extensivamente. Em particular, há um certo número de propostas para a protecção de dados utilizando os dados biométricos (por exemplo, impressões digitais ou de um exame de retina) como uma chave. Uma abordagem típica é a utilização de um código de correção de erro adequado, pegue a sua chave K material original, calcular a síndrome dele e só armazenar a síndrome. Depois de obter uma segunda leitura do seu K material de chave 'a síndrome pode ser usado para restaurar K de K' se K e K 'estão perto o suficiente (onde' perto o suficiente", é claro depende do esquema de correção de erro.)

Para começar, aqui está um artigo propondo uma difusa esquema abóbada . Esta é uma proposta geral para um esquema de criptografia usando uma chave "difusa". Claro, você ainda precisa examinar como extrair características de desenhos que são suficientemente estável para usar tal um esquema de correção de erros. Você também terá de examinar o quanto entropia você pode extrair de tais desenhos. Tão mau como as senhas são com relação à entropia, eles ainda podem ser difícil de bater.

Outras dicas

Gostaria de tentar uma variação da variante segmentação:. Reconhecer padrões simples - Vou ficar com linhas retas e diagonais para isso, mas, em teoria, você também pode adicionar círculos, arcos e talvez outras coisas

Você pode estar certo quando termina uma linha e outra começa, pois há 8 direções e você pode detectar uma mudança de direção (ou para uma abordagem mais simples, apenas detectar caneta para cima e caneta para baixo e usá-los como delimitadores de linha). A primeira linha dá um factor de escala, de modo que o comprimento de cada linha pode ser representada como um factor (por exemplo, em uma forma habitual G, a primeira linha vertical daria o "comprimento da base" b e a outra linha teria então o comprimento de cerca de 0,5 * b). Depois que o usuário estiver concluída, você pode usar o menor fator de s para "redondos" os comprimentos, de modo que você vai ter uma variedade de comprimentos inteiros como [1 * s, 2 * s, 4 * s, 5 * s]. Isso impedirá que o sistema de ser muito exato, e usando o comprimento de base faz com que o sistema robusto contra escala.

Agora, de alguma forma converter essas informações (comprimentos e direções) para uma string (ou um valor de hash, o que quiser) e será o mesmo para os mesmos traços, mesmo se o símbolo é traduzido ou dimensionada.

Além disso, você pode armazenar um 2D valor de deslocamento (claro "arredondado", também) para cada linha após a segunda linha para que as linhas também terá que estar na mesma posição, se você não fizer isso, L e T provavelmente irá obter a mesma cadeia (1 linha de cima para baixo, uma linha de esquerda-direita comprimento 0,5). Então armazenar posições fortalece a coisa toda um pouco, mas é opcional.

EDIT:

Se você pegar o ângulo da primeira linha como um ângulo de base, você pode até fazer isso robusta para rotação.

Por favor note que este algoritmo só dá 3 bits por acidente vascular cerebral se todas as linhas são do mesmo comprimento e um máximo de talvez até 6-8 bits por acidente vascular cerebral, um pouco mais se você guardar posições também. Isto significa que você precisa de um símbolo bastante complexo de cerca de 20-40 cursos para obter 128 bits de segurança.

Uma maneira fácil de adicionar mais variação / segurança seria deixar o usuário usar cores diferentes a partir de uma dada paleta.

Para reduzir o risco de alguém observando você, você poderia fazer cada linha desaparecem depois de ter sido tirada ou mudar a cor para uma cor com um nível muito baixo contraste com o fundo.

O reconhecimento de escrita, muitas vezes leva a duração do acidente vascular cerebral em conta mais do que o comprimento real e tal.

Enquanto se refere à sensibilidade à pressão, eu acho que você pode ser capaz de ver alguns pedaços conceituais semelhantes ao que você está pensando aqui .... jdadesign.net/safelock/

Isso não é exatamente o mesmo tema, mas é a coisa mais próxima que vem à mente no momento.

Eu não acho que você poderia começar "bits" suficientes de um símbolo desenhado à mão para realizar criptografia segura. Como você notar, você tem que permitir despejos suficiente no reconhecimento de que as variações naturais no desenho serão tolerados. Em outras palavras, você tem que ruído de descarte nos traços, alisando-os em sinal reprodutível. Mas o ruído (alta entropia) torna as chaves criptográficas melhor.

Pense nisso desta maneira. Se você fez decompor o gesto em segmentos de cima, baixo, esquerda e direita, cada segmento representaria 2 bits de informação. Para uma chave AES, o símbolo precisaria de 64 desses segmentos. Isso é um gesto muito complicado para se lembrar. E se está simplificado, repetindo muitos segmentos em uma linha ( "direita, direita, direita, ...") faz um péssimo chave (previsível, não aleatória).

Eu tive outro pensar sobre isso. Eu não sou uma pessoa comp-sci, mas seria algo como este trabalho.

Vamos dizer que, com o símbolo ou "padrão" alguém chama. A única coisa viável você é deixado com a analisar são todos os pontos no padrão gerado em eventos touchBegan, touchMoved e touchEnded.

Então ... vamos dar todos os pontos gerados, seja 100 ou 1.000.000, isso realmente não importa.

Divida-os em grupos, quantos grupos quiser. Quanto mais, melhor eu assumo, mas para este exemplo, vamos colocá-los em 4 grupos. Com 100 pontos, um grupo conteria pontos 1> 25, grupo 2 contém 26> 50 e assim por diante.

Para cada grupo, use todos os pontos para calcular uma posição média.

Ele pode funcionar melhor se os espaços de lona é dividido em uma grade, e as 'posições médias' se plotados seu mais próximo de coordenadas.

Em seguida, verifique a distância relativa entre todos os grupos. Assim, a entre 1,2 1,3 1,4 2,3 2,4 3,4.

Você agora tem o maior número de pontos distintos, e as informações sobre esses pontos para gerar uma chave. As médias e a grade deve ajudar a suavizar alguns, se não toda a entropia.

Você pode ter que pedir ao usuário desenhar o seu padrão algumas vezes, e comparar cada grupo contra grupos de tentativas anteriores. Dessa forma, você pode identificar quais os grupos os usuários podem traçar de forma consistente. Ele tem a vantagem de treinar a mão do usuário a desenhar seu padrão.

Eu suspeito que mais pontos e grupos que você tem, mais preciso este será.

Na verdade, eu vou dar-lhe uma tentativa mim.

gestos.

http://depts.washington.edu/aimgroup/proj/dollar/

Você pode definir você possui algoritmos para gestos particulares. EG um círculo,

1.Find o ponto de início 2. Encontre o mais à esquerda, mais à direita e mais distante de pontos e obter um raio aproximado. 3. Verifique todos os pontos contra o raio com uma margem de erro (25%?) 4. Se o raio cheques fora, você tem um círculo.

Linha reta Vertical: 1. Verificar o ponto inicial e ponto final posições de X e Y. 2. Compare os pontos no meio destes contra o x e y do início e do fim. 3. Se eles são mais ou menos na mesma X coord, mas ascendente ou descendente coords Y, você tem uma linha vertical.

E assim por diante, cada vez mais complexo para gestos mais complicado.

Você pode até combinar gestos. Então, digamos que você tem um algoritmo para 6 gestos. Você pode combiná-las para formar símbolos diferentes. A ordem em que os gestos são criados poderia ser importante, adicionando uma camada extra de segurança.

E se você tomou todas as coordenadas x, y do acidente vascular cerebral e pré-formada algum tipo de linear 2 modo de operação sobre eles? Você poderia, então, calcular um hash 'aproximado', e se o número calculado quando o curso está dentro ... digamos 10% de sua aproximação, então você conceder acesso ..

Tudo depende de que tipo de ataque que você está tentando prevenir contra. Se você quiser completo sobre criptografia, onde você assumir que o atacante tem acesso total ao arquivo criptografado, então você vai precisar de um monte de bits de entropia para atingir um nível razoável de proteção. Supondo que você obter os algoritmos de direita, então você pode ter os dois para o poder da entropia de entrada em bits (o limite superior para isso é o número de entradas diferentes possíveis), multiplicar pela quantidade de tempo que o procedimento de configuração das chaves é, dividir por quanto mais poder de computação o atacante tem e obter o tempo que o atacante tem que tomar para quebrar sua criptografia pela força bruta.

Por exemplo, algo como a figura método de desbloqueio de 9 células do Android você pode obter em torno de 16 bits de entropia. Vamos supor que você use 5 segundos de tempo de CPU para calcular a chave de criptografia. Em seguida, com um PC média, leva 5 * 2 ** 16/20 segundo, ou cerca de 4,5 horas a rachar. Qualquer perda de entropia na entrada ou ineficiência na chave-setup e criptografia vai rapidamente levar isso para minutos, para não mencionar se forem utilizados clusters de computadores.

Para ser franco, isso não vai ser muito melhor do que apenas armazenar o arquivo em um formato de arquivo obscuro e esperando que ninguém figuras-lo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top