RegEx para que coincida con las direcciones de Bitcoin?
(6)
Basado en la descripción aquí: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki Yo diría que la expresión regular para una dirección de bitcoin Bech32 para la versión 1 y la versión 0 (solo para mainnet) es:
/bbc(0([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59})|1[ac-hj-np-z02-9]{8,87})/b
Aquí hay algunos otros enlaces donde encontré infos:
Estoy tratando de encontrar una expresión regular para hacer coincidir las direcciones de Bitcoin de acuerdo con estas especificaciones :
Una dirección de Bitcoin, o simplemente una dirección, es un identificador de 27-34 caracteres alfanuméricos, comenzando con el número 1 o 3 [...]
Pensé que se vería algo como esto
/^[13][a-zA-Z0-9]{27,34}/
La cosa es que no soy bueno con las expresiones regulares y no he encontrado una sola fuente para confirmar que esto no crearía falsos negativos.
He encontrado uno en línea que es ^1[1-9A-Za-z][^OIl]{20,40}
, pero ni siquiera sé qué significa la parte [^OIl]
y no parece coincide con el 3
una dirección de Bitcoin podría comenzar.
Como el OP no proporcionó un caso de uso específico (solo criterios coincidentes) y encontré esto en la investigación de métodos para detectar direcciones de BitCoin, quería publicar y compartir con la comunidad.
Estos RegEx proporcionados encontrarán las direcciones de BitCoin al comienzo de una línea y / o al final de la línea. Mi caso de uso fue encontrar direcciones de BitCoin en el cuerpo de un correo electrónico dado el aumento de chantaje / sextortion (Referencia: https://krebsonsecurity.com/2018/07/sextortion-scam-uses-recipients-hacked-passwords/ ) - así que estas no fueron soluciones efectivas (como se describe más adelante). El RegEx propuesto detectará muchos FP en el correo electrónico, debido a los nombres de archivo y otros identificadores dentro de las URL. No estoy eliminando las soluciones, ya que funcionan para ciertos casos de uso, pero simplemente no funcionan para la mía. Una variante atrapó muchos correos electrónicos no deseados en un corto período de tiempo de alertas pasivas (a continuación se presentan ejemplos).
Aquí están mis casos de prueba:
--------------------------------------------------------
BitCoin blackmail formats observed (my org and online):
--------------------------------------------------------
BTC Address: 1JHwenDp9A98XdjfYkHKyiE3R99Q72K9X4
BTC Address: 1Unoc4af6gCq3xzdDFmGLpq18jbTW1nZD
BTC Address: 1A8Ad7VbWDqwmRY6nSHtFcTqfW2XioXNmj
BTC Address: 12CZYvgNZ2ze3fGPFzgbSCELBJ6zzp2cWc
BTC Address: 17drmHLZMsCRWz48RchWfrz9Chx1osLe67
Receiving Bitcoin Address: 15LZALXitpbkK6m2QcbeQp6McqMvgeTnY8
Receiving Bitcoin Address: 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5
--------------------------------------------------------
Other possible BitCoin test cases I added:
--------------------------------------------------------
- What if text comes before and/or after on same line? Or doesn''t contain BitCoin/BTC/etc. anywhere (or anywhere close to the address)?
Send BitCoin payments here 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5
1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5 to keep your secrets safe.
Send payments here 1MAFzYQhm6msF2Dxo3Nbox7i61XvgQ7og5 to keep your secrets safe.
- Standalone address:
1Dvd7Wb72JBTbAcfTrxSJCZZuf4tsT8V72
--------------------------------------------------------
Redacted Body content generating FPs from spam emails:
--------------------------------------------------------
src=3D"https://example.com/blah=3D2159024400&t=3DXWP9YVkAYwkmif9RgKeoPhw2b1zdMnMzXZSGRD_Oxkk"
"cursor:pointer;color:#6A6C6D;-webkit-text-size-blahutm_campaign%253Drdboards%2526e_t%253Dd5c2deeaae5c4a8b8d2bff4d0f87ecdd%2526utm_cont=blah
src=3D"https://example.com/blah/74/328e74997261d5228886aab1a2da6874.jpg"
src=3D"https://example.com/blah-1c779f59948fc5be8a461a4da8d938aa.jpg"
href=3D"https://example.com/blah-0ff3169b28a6e17ae8a369a3161734c1?alert_=id=blah
Algunas muestras de RegEx que probé (no enumerarán las que llamaría para codiciosos codazos con backtraces):
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
(Too narrow and misses BitCoin addresses within a paragraph)
(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$
(Still misses text after BTC on same line and triples execution time)
/W[13][a-km-zA-HJ-NP-Z1-9]{25,34}/W
(Too broad and catches URL formats)
Estoy evaluando el RegEx actual que captura todos mis casos de muestra conocidos / elaborados y elimina los FP conocidos (evitando específicamente el final del período de la oración para los FP de los nombres de URL):
[13][a-km-zA-HJ-NP-Z1-9]{25,34}/s
Un punto de referencia para los tiempos de ejecución (muestra el costo en pasos y tiempo): https://regex101.com/
Por favor, siéntase libre de opinar o proporcionar sugerencias sobre mejoras (de ninguna manera soy un maestro de RegEx). A medida que lo analizo contra la detección de correo electrónico del contenido del Cuerpo, actualizaré si se observan otros casos de PF o si se deriva RegEx más eficiente.
Set
[^OIl]
coincide con cualquier carácter que no sea O, I o l. Los problemas en su expresión regular son:
- No tiene un
$
al final, por lo que coincidirá con cualquier cadena que comience con una dirección de BC. - No
{27,34}
el primer carácter en tu{27,34}
- debería ser{26,33}
Sin embargo, como se mencionó en un comentario, una expresión regular no es una buena manera de validar una dirección de bitcoin.
^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$
Basado en el nuevo tipo de dirección Bech32
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
coincidirá con una cadena que comienza con 1
o 3
y, después de eso, contiene de 26 a 33 caracteres de az, AZ, 0-9, excluyendo O
, I
y l
(no son caracteres válidos en una dirección de Bitcoin).
^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$
la dirección de bitcoin es
- un identificador de 26-35 caracteres alfanuméricos
- comenzando con el numero 1 o 3
- dígitos aleatorios
- mayúscula
- letras minusculas
- con la excepción de que la letra
O
mayúscula, la letraI
mayúscula, la letral
minúscula y el número0
nunca se utilizan para evitar la ambigüedad visual.